Go-redis
go get -u github.com/go-redis/redis
一般的init操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| // 根据redis配置初始化一个客户端 func initClient() (err error) { redisDb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", // redis地址 Password: "", // redis密码,没有则留空 DB: 0, // 默认数据库,默认是0 })
//通过 *redis.Client.Ping() 来检查是否成功连接到了redis服务器 _, err = redisDb.Ping().Result() if err != nil { return err } return nil }
|
type.Option还有包括设置连接方式,连接池相关,持续时间等很多字段,用的时候可以去查。
基本键值的一些操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //第三个参数为失效时间, 0为永久有效 err = redisDb.Set("name", "zbs", 0).Err() if err!=nil{ panic(err) }
redisDb.Append("name", "123") redisDb.Expire("name", 3*time.Second) time.Sleep(5*time.Second) val, err := redisDb.Get("name").Result() if err != nil{ panic(err) } fmt.Println(val)
|
这里设置key的过期时间为3s,sleep 5s后,key已经被废除,此时Get中的key不复存在,触发panic
还有很多方法, 包括
1
| MGet() / MSet() / Incr() / Decr() ...
|
列表 List
允许元素重复且内部是有序的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| //只保留区间内的元素 redisDb.LTrim("studentsList", 0, 0) redisDb.LPush("studentsList", "James", "Marry", "Ken", "Joe") // 0 到 -1即返回所有元素 vals, _ := redisDb.LRange("studentsList", 0, -1).Result() fmt.Println(vals)
for _, v := range vals{ fmt.Printf("%s ", v) } length , _:= redisDb.LLen("studentsList").Result() fmt.Printf("\nLength is %d\n", length)
else:
LSet(key, index, newval) //指定位置覆盖 LInsert() LPop()/LRem()/RPop()
|
集合 Set
set 类型(集合)是 string 类型数值的无序集合,并且集合元素唯一。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| //集合类型操作: //求并集 SUnion(keys ...string) *StringSliceCmd //求差集 SDiff(keys ...string) *StringSliceCmd //求交集 SInter(keys ...string) *StringSliceCmd
redisDb.SAdd("stuSet", 100, 200, 300) //获取集合中元素的个数 size, err := redisDb.SCard("stuSet").Result() if err != nil { panic(err) } fmt.Println(size)
es, _ := redisDb.SMembers("stuSet").Result() fmt.Println(es)
SPop() SRem(): //删除集合stuSet名称为500,600的元素,并返回删除的元素个数 member3, err := redisDb.SRem("stuSet", 500, 600).Result() SRandMember(N)()
//把集合里的元素转换成map的key map1, err:= redisDb.SMembersMap("stuSet").Result() fmt.Println(map1) //map[100:{} 200:{} 300:{} 400:{} 500:{} 600:{}]
|
Hash:
操作跟基本操作类似,在前面都加了个 ‘H’表示hash独有
注意查询方式有所不同,需要根据key和字段名才行
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //根据key和field字段设置,field字段的值。 user_1 是hash key,username 是字段名, admin是字段值 err = redisDb.HSet("user_1", "username", "admin").Err() if err != nil { panic(err) } //根据key和field字段,查询field字段的值。user_1 是hash key,username是字段名 username, err := redisDb.HGet("user_1", "username").Result()
if err != nil { panic(err) } fmt.Println(username) //admin //继续往user_1中添加字段password _ = redisDb.HSet("user_1", "password", "abc123").Err()
|
通过其与map结构的关系,可以通过map进行对hash的初始化
1 2 3 4 5 6 7 8 9 10 11 12 13
| // 初始化hash数据的多个字段值 batchData := make(map[string]interface{}) batchData["username"] = "test" batchData["password"] = 123456 // 一次性保存多个hash字段值 err = redisDb.HMSet("user_2", batchData).Err()
// 根据key返回所有字段名 HKeys(keyName) //删除字段 HDel(hashKey, field)
HExists(hashkey, field)
|
Sorted Set
Redis有序集合(sorted set)和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,这个分数主要用于集合元素排序。
redis中专门的结构:
1 2 3 4 5 6
| //redis.Z //Z represents sorted set member. type Z struct { Score float64 // 分数 Member interface{} // 元素名 }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| zsetKey := "language_rank" languages := []redis.Z{ {Score: 90.0, Member: "Golang"}, {Score: 98.0, Member: "Java"}, {Score: 95.0, Member: "Python"}, {Score: 97.0, Member: "JavaScript"}, {Score: 92.0, Member: "C/C++"}, } //添加成功的个数 num, _ := redisDb.ZAdd(zsetKey, languages...).Result() fmt.Println(num)
size, _ = redisDb.ZCard(zsetKey).Result() //范围为闭区间 count, _ := redisDb.ZCount(zsetKey, "90.0", "95.0").Result() fmt.Printf("size is %d, and count between 90-95 is %d\n", size, count)
// 初始化查询条件, Offset和Count用于分页, 第二个参数ZRangeBy op := redis.ZRangeBy{ Min:"80", // 最小分数 Max:"100", // 最大分数 Offset:0, // 类似sql的limit, 表示开始偏移量 Count:5, // 一次返回多少数据 } //根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页。 values, _ := redisDb.ZRangeByScore(zsetKey, op).Result() for _, val := range values { fmt.Println(val) } //查询指定元素的分数或排名 ZScore(key, "元素名") ZRank() ZRem(key, "元素名") //按从小到大的排序删除元素 //指定负数即为从高到低 ZRemRangeByRank(key, left, right)
|
redis-transaction
这里简单介绍一些事务的基本操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| //统计开发语言排行榜 zsetKey := "language_rank" // 开启一个TxPipeline事务 pipe := redisDb.TxPipeline() defer pipe.close() // 执行事务操作,可以通过pipe读写redis incr := pipe.Incr(zsetKey) pipe.Expire(zsetKey, time.Hour)
// 通过Exec函数提交redis事务 _, err = pipe.Exec()
// 提交事务后,我们可以查询事务操作的结果 // 前面执行Incr函数,在没有执行exec函数之前,实际上还没开始运行。 fmt.Println(incr.Val(), err)
|