Go 操作 Redis

Redis是什么

Redis(Remote Dictionary Server): Redis是分布的(集群模式),具有列表结构的内存数据库,key-value存储,内容可以持久化到磁盘。
Go Redis连接:

redisPsm := "xxx"
opt := goredis.NewOption()
opt.SetServiceDiscoveryWithConsul()
var err error
var redisClient *goredis.Client
redisClient, err = goredis.NewClientWithOption(redisPsm, opt)
if err != nil || redisClient == nil {
   logs.Errorf("connect redis(PSM: %s) meeting error: %s", redisPsm, err.Error())
   return
}

Redis五种常用数据结构

String
Redis的字符串在类型的设计上,除了包含字符数组buf,还会额外存储实际字符串的长度以及buf的剩余空间,从而提供更灵活的管理方式。
例如,APPEND命令,会将参数value数据append到已存在value的末尾,如果key不存在,会创建新的key/value,返回值是追加后value的长度;INCR命令,会将指定key的value原子性的+1,如果该Key不存在,其初始值为0,在incr之后其值为1,如果Value的值不能转换为整型值,该操作将执行失败并返回相应的错误信息。还有INCRBY, DECR, DECRBY, GET, SET等。

_ = redisClient.Set("key", "value", 0)
_ = redisClient.Append("key","testAppend")
_ = redisClient.Get("key")

Hash
Hash是一个string类型的field和value的映射表。例如,对于一个用户(key),可以存他的多个信息,名字(field)张(value),年龄(field)20(value),在数据量大时,可以避免全都存为key/value对造成的内存浪费。
常见命令有HSet,HGet,HGetAll,HVals, HLen,可以插入/查询某个key存的内容,也可以创建新的key。

_ = redisClient.HSet("key","field","value")
_ = redisClient.HGet("key", "field")
_ = redisClient.HLen("key")
_ = redisClient.HVals("key") //返回名称为key的hash中所有键对应的value
_ = redisClient.HGetAll("key") //返回名称为key的hash中所有的键(field)及其对应的value
_ = redisClient.HExists("key", "field")

List
List为一个双向链表,支持反向插入,查找,遍历。List提供了丰富的接口,广泛用于缓冲队列,消息队列等应用场景。

_ = redisClient.LPush("key", "value") // 插在头部,返回插入后链表中元素个数
_ = redisClient.RPush("key", "value") // 插在尾部,返回插入后链表中元素个数
_ = redisClient.LPop("key") // 返回并弹出头部元素
_ = redisClient.RPop("key") // 返回并弹出头部元素
_ = redisClient.LLen("key") // 返回列表中元素个数

Set
Set相当于一个可以自动去重的列表。它的内部其实是一个value值为null的HashMap。当某些应用场景需要存储一个列表,且不想要重复的数据时,就可以选择set。

_ = redisClient.SAdd("key", "field1", "field2", "field3") // 返回实际插入的成员数量(去重后)
_ = redisClient.SRem("key", "field1", "field2") // 删除
_ = redisClient.SCard("key") // 返回此key中成员数量
_ = redisClient.SIsMember("key", "field3")

Zset (Sorted Set)
在Set的基础上,可以用用户提供的一个优先级参数来实现自动排序。

var z redis.Z
z.Score = 100
z.Member = "test1"
_ = redisClient.ZAdd("key", z)
_ = redisClient.ZAddXX("key", z) // 只更新存在的成员,不添加新成员。
_ = redisClient.ZAddNX("key", z) // 不更新存在的成员。只添加新成员。
_ = redisClient.ZIncr("key", z)  // 对成员的分数进行递增操作,在此模式下只能指定一对分数/成员。
_ = redisClient.ZAddCh("key", z) // CH:改变返回值 没有指定该参数时,返回的是新添加成员的总数,指定时,返回的是新添加的成员 + 发生更新的成员