《Redis开发与运维》—- 有序集合ZSet

  • Post author:
  • Post category:其他



元素可以排序,每个元素设置一个分数(score)作为排序的依据。集合成员(member)不能重复,但是每个元素的score可以重复



命令
  • 集合内
# 添加成员
zadd key score member [score member ...]
# Redis3.2为zadd命令添加了nx、 xx、 ch、 incr四个选项:
# nx: member必须不存在, 才可以设置成功, 用于添加。
# xx: member必须存在, 才可以设置成功, 用于更新。
# ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
# incr: 对score做增加, 相当于后面介绍的zincrby。

zcard key # 算成员个数

zscore key member # 计算某个成员的分数

# 计算成员的排名
zrank  key member # 分数由低到高,score正序
zrevrank key member # 分数由高到低,score倒序

zrem key member [member ...] # 删除成员

zincrby key increment member # 增加成员分数

# 返回指定排名范围的成员
zrange key start end [withscores] # 分数由低到高,score正序
zverrange key start end [withscores] # 分数由高到低,score倒序
# zrange key 0 -1 withsocres 返回所有成员及其分数

# 返回指定分数范围的成员
zrangebyscore key min max [withscores]  [limit offset count] # 分数由低到高,score正序
zverrangebyscore key min max [withscores]  [limit offset count] # 分数由高到低,score倒序
#  [limit offset count]选项可以限制输出的起始位置和个数 。min和max还支持开区间(小括号) 和闭区间(中括号), -inf和+inf分别代表无限小和无限大。
zrangebyscore user:ranking (200 (500 withscores # 表示 200<score<500 的成员
zrangebyscore user:ranking [200 [500 withscores # 表示 200<=score<=500 的成员
zrangebyscore user:ranking [200 +inf withscores # 表示 200<=score<无限大 的成员

# 返回指定分数范围成员个数
zcount key min max

# 删除指定排名内的升序元素
zremrangebyrank key start end

# 删除指定分数范围的成员
zremrangebyscore key min max 

  • 集合间
# 交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]][aggregate sum|min|max]
# destination: 交集计算结果保存到这个键。
# numkeys: 需要做交集计算键的个数。
# key[key...]: 需要做交集计算的键。
# weights weight[weight...]: 每个键的权重, 在做交集计算时, 每个键中的每个member会将自己分数乘以这个权重, 每个键的权重默认是1。
# aggregate sum|min|max: 计算成员交集后, 分值可以按照sum(和)、min(最小值)、max(最大值)做汇总, 默认值是sum 
zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2 # 表示user:ranking:1 和user:ranking:2这2个集做交集,放入user:ranking:1_inter_2集合中

# 并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]][aggregate sum|min|max] 
# 参数同交集的是一样的



内部编码
  • ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist

    可以有效减少内存的使用
  • skiplist(跳跃表):当ziplist条件不满足时, 有序集合会使用skiplist作为内部实现, 因为此时ziplist的读写效率会下降。


使用场景
  • 排行榜系统



版权声明:本文为jushisi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。