redis五种数据结构
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
(一)string
关联锁
set key value:将字符串值value关联到key
如果key已经有其他值,set就覆写旧值,无视类型
setnx key value:将key的值设为value,当且仅当key不存在,若给定的key已经存在,则setnx 不做任何动作
计数器
INCR article:readout:{文章id}
GET article:readout:{文章id}
分布式系统全局序列号
INCRBY orderID 1000 //redis批量生成序列号提升性能
(二)hash
对象缓存
HMSET user {userID}:name zhuge {userID}:balance 1888
优化方式:外层的key可以分片
例子:购物车操作
用户id 为key 商品id为field 商品数量为value
添加商品:hset cart:1001 10088 1
增加数量:hincrby cart:1001 10088 1
商品总数:hlen cart:1001
删除商品:hdel cart:1001 10088
获取所有商品:hgetall cart:1001
(三)list
LPUSH key value[value…] 从左边放元素
Rpush key value[value…] 从右边放元素
LPOP key 从左边拿元素
RPOP key 从右边拿元素
例子:微博消息和公众号消息
阿信发微博,消息id为10018
LPUSH msg:{阿信-ID} 10018
查看最新消息:LRANGE msg:{阿信-id} 0 4
可以用管道分批
(四)set
sadd key number
srem key number 删除元素
scard key 所有元素的个数
操作
交集SINTER set1 set2 set3
并集SUNION set1 set2 set3
差集SDIFF set1 set2 set3 (1减去2和3的并集)
例子:抽奖小程序
SADD key {userid} 加入集合
SMEMBERS key 查看所有元素
SRANDMEMBER key [count] 随机抽取,但是抽取的元素还在原集合内
SPOP act:1001 3 随机抽取 三个,但是这三个元素不在原集合内了
例子:点赞、收藏
点赞 SADD like:{消息id} {用户id}
取消点赞 SREM like:{消息id} {用户id}
检测用户是否点赞 SISMEMBER like:{消息id} {用户id}所有
所有点赞用户:SMEMBERS like:{消息id}
例子:共同关注
sinter 用交集
我关注的人也关注它 用sismember
可能认识的人 用sdiff差集
(五)zset
zset集合操作实现排行榜
点击新闻: zincrby hotnews:20190819 1 xxx
排行榜前十: zrevrange hotnews:20190819 0 9 withscores(倒序前十)zrange 是正序
七日排行榜: zunionstore hotnews:20190813-20190819 7(并集)
zinterstore 交集