尚硅谷go语言核心编程课程golang redis学习指南_第1页
尚硅谷go语言核心编程课程golang redis学习指南_第2页
尚硅谷go语言核心编程课程golang redis学习指南_第3页
尚硅谷go语言核心编程课程golang redis学习指南_第4页
尚硅谷go语言核心编程课程golang redis学习指南_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Golang redis 学习指南安装我使用的是 /go-redis/r. 这个下:golang 客户端, 因此安装方式如接着在代码中导入此包即可:基本操作创建客户端通过 redis.NewC nt 函数即可创建一个 redis 客户端,这个方法接收一个 redis.Options对象参数, 通过这个参数,库名, 数据库等.可以配置 redis 相关的属性, 例如 redis 服务器地址, 数据接的例子:下面是/ 创建 redis 客户端func createCnt() *redis.Cnt cnt := redis.NewCnt(&redis.Options Addr:localhost:6

2、379,Password: , DB:0,)/ 通过 cient.() 来检查是否成功连接到了 redis 服务器pong, err := cnt.().Result() fmt.Prln(pong, err)import gopkg.in/redis.v4go get gopkg.in/redis.v4String 操作redis的 String操作有:在 go-redis 中,可以直接找到对应的操作方法, 直接上代码:/ String 操作func stringOperation(cnt *redis.Cnt) / 第三个参数是过期时间, 如果是 0, 则表示没有过期时间. err :=

3、cnt.Set(name, xys, 0).Err()if err != nil panic(err)set(key, value):给数据库中名称为 key 的string 赋予值 value get(key):返回数据库中名称为 key 的string 的value getset(key, value):给名称为 key 的 string 赋予上一次的value mget(key1, key2, key N):返回库中多个string 的 value setnx(key, value):添加 string,名称为 key,值为 value setex(key, time, value):向

4、库中添加 string,设定过期时间 time mset(key N, value N):批量设置多个 string 的值msetnx(key N, value N):如果所有名称为 key i 的string 都不存在incr(key):名称为 key 的string 增 1 操作incrby(key,eger):名称为 key 的string 增加eger decr(key):名称为 key 的string 减 1 操作decrby(key,eger):名称为 key 的string 减少eger append(key, value):名称为 key 的 string 的值附加value

5、substr(key, start, end):返回名称为 key 的string 的 value 的子串return cntval, err := cnt.Get(name).Result()if err != nil panic(err)fmt.Prln(name, val)/ 这里设置过期时间.err = cnt.Set(age, 20,1 * time.Second).Err()iferr != nil panic(err)/ 自增/ 自增/ 自减cnt.Incr(age)cnt.Incr(age)cnt.Decr(age)val, err = cnt.Get(age).Result(

6、)if err != nil panic(err)ln(age, val) / age 的值为 21fmt.Pr/ 因为动被删除了.key age 的过期时间是一秒钟, 因此当一秒后,此会自keytime.Sleep(1 * time.Second)val, err = cnt.Get(age).Result()if err != nil/ 因为 key age 已经过期了, 因此会有一个 redis: nil的错误.list 操作redislist操作有:的同样地, 在 go-redis 中也可以找到对应的方法, 下面是一个简单的示例:/ list 操作func listOperation(

7、cnt *redis.Cnt) cnt.RPush(fruit, apple) /在名称为 fruit 的list 尾添加一个值为value 的元素cnt.LPush(fruit, banana) /在名称为 fruit 的list 头添加一个值为value 的 元素rpush(key, value):在名称为 key 的list 尾添加一个值为value 的元素 lpush(key, value):在名称为 key 的list 头添加一个值为value 的 元素 llen(key):返回名称为 key 的list 的长度lrange(key, start, end):返回名称为 key 的l

8、ist 中 start 至end 之间的元素ltrim(key, start, end):截取名称为 key 的listlindex(key, index):返回名称为 key 的 list 中index 位置的元素 lset(key, index, value):给名称为 key 的list 中 index 位置的元素赋值 lrem(key, count, value):删除 count 个 key 的list 中值为value 的元素 lpop(key):返回并删除名称为 key 的list 中的首元素 rpop(key):返回并删除名称为 key 的list 中的尾元素blpop(key

9、1, key2, key N, timeout):lpop 命令的 block 版本。brpop(key1, key2, key N, timeout):rpop 的 block 版本。rpoplpush(srckey, dstkey):返回并删除名称为 srckey 的list 的尾元素,并将该元素添加到名称为dstkey 的list 的头部fmt.Prf(error: %vn, err)fmt.Prln(age, val)set 操作redis 的 set 操作:sadd(key, member):向名称为 key 的set 中添加元素member srem(key, member) :删

10、除名称为 key 的set 中的元素member spop(key) :随机返回并删除名称为key 的 set 中一个元素 smove(srckey, dstkey, member) :移到集合元素 scard(key) :返回名称为 key 的set 的基数sismember(key, member) :member 是否是名称为key 的set 的元素length, err := cnt.LLen(fruit).Result() /返回名称为 fr uit 的list 的长度if err != nil panic(err)fmt.Prln(length: , length) / 长度为 2

11、value, err := cnt.LPop(fruit).Result() /返回并删除名称为 fruit 的list 中的首元素if err != nil panic(err)fmt.Prln(fruit: , value)value, err = cnt.RPop(fruit).Result() / 返回并删除名称为 fruit 的list 中的尾元素if err != nil panic(err)fmt.Prln(fruit: , value)接下来是 go-redis 的 set 操作:/ set 操作func setOperation(cnt *redis.Cnt) cnt.SAd

12、d(blacklist, Obama) / 向 blacklist 中添加元素cnt.SAdd(blacklist, Hillary) / 再次添加cnt.SAdd(blacklist, the Elder) / 添加新元素cnt.SAdd(whiist, the Elder) / 向 whiist 添加元素/ 判断元素是否在集合中isMember, err := cnt.SIsMember(blacklist, Bush).Resu lt()if err != nil panic(err)fmt.Prln(Is Bush in blacklist: , isMember)/ 求交集, 即既在

13、中, 又在白中的元素names, err := cnt.Ser(blacklist, whiist).Result()ser(key1, key2,key N) :求交集serstore(dstkey, (keys) :求交集并将交集保存到dstkey 的集合sunion(key1, (keys) :求并集sunionstore(dstkey, (keys) :求并集并将并集保存到dstkey 的集合sdiff(key1, (keys) :求差集sdiffstore(dstkey, (keys) :求差集并将差集保存到dstkey 的集合 smembers(key) :返回名称为key 的 s

14、et 的所有元素 srandmember(key) :随机返回名称为 key 的set 的一个元素hash 操作redis 的 hash 操作:hset(key, field, value):向名称为 key 的hash 中添加元素 field hget(key, field):返回名称为 key 的 hash 中field 对应的value hmget(key, (fields):返回名称为 key 的hash 中field i 对应的value hmset(key, (fields):向名称为 key 的 hash 中添加元素fieldhincrby(key, field,eger):将名

15、称为 key 的hash 中field 的 value增加egerhexists(key, field):名称为 key 的hash 中是否存在键为field 的域 hdel(key, field):删除名称为 key 的 hash 中键为field 的域 hlen(key):返回名称为 key 的hash 中元素个数 hkeys(key):返回名称为 key 的hash 中所有键 hvals(key):返回名称为 key 的hash 中所有键对应的valueif err != nil panic(err)/ 获取到的元素是 the Elderfmt.Prln(er result: , nam

16、es)/ 获取指定集合的所有元素all, err := cnt.SMembers(blacklist).Result() if err != nil panic(err)fmt.Prln(All member: , all)go-redis 中的 hash 操作:/ hash 操作func hashOperation(cnt *redis.Cnt) cnt.HSet(user_xys, name, xys); / 向名称为 user_xys的 hash 中添加元素 namecnt.HSet(user_xys, age, 18); / 向名称为 user_xys的 hash 中添加元素 age/

17、 批量地向名称为 user_test 的 hash 中添加元素 name 和 agecnt.HMSet(user_test, mapstringstringname: test, age:20)/ 批量获取名为 user_test 的 hash 中的指定字段的值.fields, err := cnt.HMGet(user_test, name, age).Res ult()if err != nil panic(err)fmt.Prln(fields in user_test: , fields)/ 获取名为 user_xys 的 hash 中的字段个数length, err := cnt.H

18、Len(user_xys).Result() if err != nil panic(err)fmt.Prln(field count in user_xys: , length) / 字段个数为 2/ 删除名为 user_test 的 age 字段hgetall(key):返回名称为 key 的hash 中所有的键(field)及其对应的 va lue关于连接池redis.v4 包实现了 redis 的连接池管理, 因此 默认情况下, redis.v4 的 redis 连接池大小是 10,自行设置连接池的大小, 例如:就不需要自己手动管理 redis 的连接了.不过可以在初始化 redis

19、客户端时通过 redis.Options 的 PoolSize 属性,设置了 redis 连接池的大小为 5.效果吧:那么接下来来看一下这个设置/ redis.v4 的连接池管理func connectPool(cnt *redis.Cnt) wg := sync.WaitGroupwg.Add(10)for i := 0; i 10; i+ go func() defer wg.Done()cnt := redis.NewCnt(&redis.Options Addr:localhost:6379,Password: , DB:0,PoolSize: 5,)cnt.HDel(user_tes

20、t, age)age, err := cnt.HGet(user_test, age).Result() if err != nil fmt.Prf(Get user_test age error: %vn, err) else fmt.Prln(user_test age is: , age) / 字段个数为 2上面的例子启动了 10 个 routine 来不断向 redis 读写数据, 然后通过cnt.PoolSs() 获取连接池的信息. 运行这个例子, 输出如下:通过输出可以看到,此时最大的连接池数量确实是 5 了, 并且一开始时,coroutine因为的数量大于 5, 会造成 redi

21、s连接的情况(反映在FreeConns 上就是前几次的输出此 redis 连接, 因此 FreeConnsFreeConns 一直是 1), 当某个 coroutine 结束后, 会会增加.PoolSs, TotalConns: 5, FreeConns: 1PoolSs, TotalConns: 5, FreeConns: 1PoolSs, TotalConns: 5, FreeConns: 1PoolSs, TotalConns: 5, FreeConns: 1PoolSs, TotalConns: 5, FreeConns: 1PoolSs, TotalConns: 5, FreeCon

22、ns: 2PoolSs, TotalConns: 5, FreeConns: 2PoolSs, TotalConns: 5, FreeConns: 3PoolSs, TotalConns: 5, FreeConns: 4PoolSs, TotalConns: 5, FreeConns: 5for j := 0; j 100; j+ cnt.Set(fmt.Sprf(name%d, j), fmt.Sprf (xys%d, j), 0).Err()cnt.Get(fmt.Sprf(name%d, j).Result()fmt.Prf(PoolSs, TotalConns: %d, FreeCon

23、ns: %dn, cnt.PoolSs().TotalConns, cnt.PoolSs().FreeConn s);()wg.Wait()完整示例/ author xiongyongs/ project go_redis/ ver1.0/ created 16/10/6 03:49/package mainimport (fmt gopkg.in/redis.v4 timesync)func main() cnt := createCnt() defer cnt.Close()stringOperation(cnt) listOperation(cnt) setOperation(cnt)

24、hashOperation(cnt)connectPool(cnt)/ 创建 redisfunc createC客户端nt() *redis.Cnt cnt :=redis.NewCnt(&redis.OptionsAddr:localhost:6379,Password: ,DB:0,PoolSize: 5,)pong, err := cnt.().Result()fmt.Prln(pong, err)return cnt/ String 操作func stringOperation(cnt *redis.Cnt) / 第三个参数是过期时间, 如果是 0, 则表示没有过期时间.err :=

25、cnt.Set(name, xys, 0).Err()if err != nil panic(err)val, err := cnt.Get(name).Result()if err != nil panic(err)fmt.Prln(name, val)/ 这里设置过期时间.err = cnt.Set(age, 20, 1 * time.Second).Err()iferr != nil panic(err)/ 自增/ 自增/ 自减cnt.Incr(age)cnt.Incr(age)cnt.Decr(age)val, err = cnt.Get(age).Result()if err !=

26、nil panic(err)ln(age, val) / age 的值为 21fmt.Pr/ 因为动被删除了.key age 的过期时间是一秒钟, 因此当一秒后,此会自keytime.Sleep(1 * time.Second)val, err = cnt.Get(age).Result()if err != nil/ 因为key age 已经过期了, 因此会有一个 redis: nil的错误.fmt.Prf(error: %vn, err)fmt.Prln(age, val)/ list 操作func listOperation(cnt *redis.Cnt) nt.RPush(fruit,

27、 apple) /在名称为 fruit 的list 尾添加c一个值为value 的元素nt.LPush(fruit, banana) /在名称为 fruit 的list 头添c加一个值为value 的 元素length, err := c uit 的list 的长度if err != nil nt.LLen(fruit).Result() /返回名称为 frpanic(err)fmt.Prln(length: , length) / 长度为 2nt.LPop(fruit).Result() /返回并删除名称value, err := c为fruit 的list 中的首元素if err != n

28、il panic(err)fmt.Prln(fruit: , value)nt.RPop(fruit).Result() / 返回并删除名称value, err = c为fruit 的list 中的尾元素if err != nil panic(err)fmt.Prln(fruit: , value)set 操作/func setOperation(cnt *redis.Cnt) nt.SAdd(blacklist, Obama) / 向 blacklist 中添加元素nt.SAdd(blacklist, Hillary) / 再次添加cccnt.SAdd(blacklist, the Elde

29、r) / 添加新元素ist, the Elder) / 向 whiist 添加元cnt.SAdd(whi素/ 判断元素是否在集合中isMember, err := clt()nt.SIsMember(blacklist, Bush).Resuif err != nil panic(err)fmt.Prln(Is Bushin blacklist: , isMember)/ 求交集, 即既在names, err := c中, 又在白中的元素nt.Ser(blacklist, whiist).Result()if err != nil panic(err)/ 获取到的元素是the Elderfmt.Prln(er result: , names)/ 获取指定集合的所有元素all, err := cnt.SMembers(blacklist).Result()if err != nil panic(err)fmt.Prln(All member: , all)/ hash 操作func hashOperation(cnt *redis.Cnt) name, xys); / 向名称为 user_xyscnt.HSet(user_xys,的hash 中添加元素 nam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论