Redis:zset范例

[复制链接]
发表于 2026-1-14 06:51:42 | 显示全部楼层 |阅读模式

在Redis中,有两种聚集范例,set和zset,此中set是无序聚集,zset是有序聚集,本博客解说Redis中的有序聚集。
在有序聚集中,要按照肯定的指标给聚集元素举行排序,Redis个每个聚集的元素引入了一个score属性,这是一个双精度浮点型,每次排序的时间,依据socre的巨细举行排序。如果分数雷同,那么以字典序排序。

zset下令

ZADD



  • 往zset中添加元素和分数
  1. zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
复制代码
选项:


  • [XX|NX]

    • XX:只更新,如果element大概key不存在,利用失败
    • NX:只添加,如果element大概key不存在,添加数据,如果存在,利用失败

  • [GT|LT]

    • LT:如果新的socre小于(Less Than)当前的score,那么更新元素
    • GT:如果新的socre大于(Greater Than)当前的score,那么更新元素

  • [CH]

    • 不加CH:zadd返回新增的元素个数
    • 加CH:zadd返回修改的元素个数

  • [INCR]:对现有的socre举行运算
示例:

此处插入了四个数据,随后通过zrange查询结果(反面讲),可以看到输出结果是以score排序的。

还可以通过zadd更新数值,把mike的值提拔到80.5后,再次查询次序就变了。

此处演示ch的功能,第一次先通过add添加了两个成员lora和meg。第二次修改lora和meg的score,结果返回值为0,这不是分析修改失败了,而是其只返回新增元素个数,而不是修改的元素个数。第三次修改lora和meg的score,而且参加ch选项,返回2分析有两个元素修改乐成了。

第一次通过zadd设置peter的score为100,第二次添加incr选项,表现在当前的score底子上再加20,返回120为增长后的结果。

ZCARD



  • 获取zset的元素个数
  1. zcard key
复制代码
返回zset的元素个数。

ZCOUNT



  • 返回指定区间内的元素个数
  1. zcount key min max
复制代码
返回score在[min, max]闭区间的元素个数,可以通过(min (max来设置开区间。

在zset3中,有五个分数12 20 42 68 88。第一次查询20 68,在闭区间内有三个数值,返回3。第二次查询(20 68,表现左开右闭区间,第三次查询(20 (68表现开区间,第四次查询20 (68表现左闭右开区间。
此处实现计数,不是查询到min和max后,遍历区间内的元素然后计数。在zset内部,会给每个元素存储其当前的排名,查询到min和max后,直接将两者的排名做差就可以得到count。
别的的,区间还支持浮点数的负无穷大-inf和正无穷大inf。

这种格式就是统计zset中全部元素个数。

ZRANGE



  • 返回指定区间内的元素,按升序排序
  1. zrange key start stop [withscores]
复制代码
按升序返回[start, stop]区间内的元素,如果带上withscores则将score一起返回。
此处的start和stop不是分数,而是元素的排名,从0开始,支持负数。
示例:


加上withcores参数后,每个元素的下一行是它的socre。

ZREVRANGE



  • 返回指定区间内的元素,按降序排序
  1. zrevrange key start stop [withscores]
复制代码
按降序返回[start, stop]区间内的元素,如果带上withscores则将score一起返回。
此处的rev表现reverse翻转,只是将原先的输出次序颠倒了一下,用法和zrange没有区别。

ZRANGEBYSCORE



  • 返回指定区间内的元素,按升序排序
  1. zrangebyscore key min max [withscores]
复制代码
按升序返回score在[min, max]区间内的元素,如果带上withscores则将score一起返回。
之前的zrange是通过元素排名返回,zrangebyscore则是通过score区间返回。
示例:

注意:官方文档表明,该下令即将被废弃,而且功能会归并到zrange中。

ZREVRANGEBYSCORE



  • 返回指定区间内的元素,按降序排序
  1. zrevrangebyscore key min max [withscores]
复制代码
按降序返回score在[min, max]区间内的元素,如果带上withscores则将score一起返回。
只是将输出次序颠倒了一下,用法和zrangebyscore一样。
注意:官方文档表明,该下令即将被废弃,而且功能会归并到zrevrange中。

ZPOPMAX



  • 获取并删除score最高的多个元素
  1. zpopmax key [count]
复制代码
返回当前的count个最大元素,而且将这些元素从zset中删除。
示例:

如果多个元素的score雷同,那么会按照member的字典序举行比力,字典序高的先删除。

BZPOPMAX



  • 读取并删除zset最大元素,如果没有元素则陷入壅闭
  1. bzpopmax key [key ...] timeout
复制代码
bzpopmax 可以同时指定多个key,也就是多个zset,只要任何一个zset有数据,就返回结果。还可以设置超时时间timeout,以秒为单元,如果超逾期间了,返回nil。
如果超时时间设置为0,则不停壅闭,不会超时。
示例:

此处启动了两个终端,左侧终端通过bzpopmax读取zset1的最大值。但是由于zset1内没有元素陷入壅闭。不久后在右侧终端插入66 lisa,此时左侧终端检测到后,立即返回结果。zset1表现自己读取到的数据属于哪一个zset,lisa是member,66是score。

ZPOPMIN



  • 获取并删除score最小的多个元素
  1. zpopmin key [count]
复制代码
返回当前的count个最小元素,而且将这些元素从zset中删除。

BZPOPMIN



  • 读取并删除zset最小元素,如果没有元素则陷入壅闭
  1. bzpopmin key [key ...] timeout
复制代码
bzpopmin 可以同时指定多个key,也就是多个zset,只要任何一个zset有数据,就返回结果。还可以设置超时时间timeout,以秒为单元,如果超逾期间了,返回nil。
如果超时时间设置为0,则不停壅闭,不会超时。

ZRANK



  • 获取指定元素的排名
  1. zrank key member
复制代码
返回指定元素member的排名,这个排名就是socre从小到大的次序,从0开始排,也可以看成下标。
示例:

此处排名最前的是lisa,下标为0。

ZREVRANK



  • 获取指定元素的排名
  1. zrevrank key member
复制代码
返回指定元素member的排名,这个排名就是socre从大到小的次序,从0开始排。
示例:


ZSCORE



  • 获取指定元素的分数
  1. zscore key member
复制代码
返回指定元素member的分数。

ZREM



  • 删除指定元素
  1. zrem key member [member ...]
复制代码
返回乐成删除的元素个数。

ZREMRANGEBYRANK



  • 根据排名,删除指定区间内的元素
  1. zremrangebyrank key start stop
复制代码
删除排名在[start, stop]闭区间范围内的元素,返回乐成删除的元素个数。
示例:


ZREMRANGEBYSCORE



  • 根据score,删除指定区间内的元素
  1. zremrangebyscore key min max
复制代码
删除分数在[min, max]闭区间范围内的元素,返回乐成删除的元素个数。
示例:


ZINCRBY



  • 为指定元素的score增长指定的值
  1. zincrby key increment member
复制代码
给member的score增长increment的值,返回增长后的结果,increment可以为负值和浮点数。

聚集间利用

在set中,提供了sinter、sunion、sdiff处理处罚交集、并集、差集。那么zset是否也有对应的zinter、zunion、zdiff?是有的,但是在Redis 6.2后才开始支持,在那之前,zset只提供了两个聚集间利用。
ZINRERSTORE



  • 求多个聚集的交集,结果生存到指定zset中
  1. zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate <sum | min | max>]
复制代码


  • destination :输出结果到给zset中
  • numkeys:指定后续输入的key的个数
  • weights:权重,每一个zset都配一个weight,盘算时score乘对应的weight
  • aggreate:score的归并方式

    • sum:求和(默认值)
    • min:取最小
    • max:取最大

示例:

此处创建了两个zset,通过zinterstore归并,此中zset1的权重是1,zset2的权重是100,以sum方式归并。末了求出交集bob 1 * 100 + 20,lisa 3 * 100 + 12。

ZUNIONSTORE



  • 求多个聚集的并集,结果生存到指定zset中
  1. zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate <sum | min | max>]
复制代码
这个参数和zinterstore完全同等,只是从交集酿成并集。



  • 总结:
下令功能zadd往zset中添加元素和分数zcard获取zset的元素个数zcount盘算在指定分数范围内的元素个数zrange获取指定区间内的元素zrevrange获取指定区间内的元素(按分数从高到低)zrangebyscore获取指定分数范围内的元素zrevrangebyscore获取指定分数范围内的元素(按分数从高到低)zpopmax弹出zset中分数最高的元素bzpopmax壅闭弹出zset中分数最高的元素zpopmin弹出zset中分数最低的元素bzpopmin壅闭弹出zset中分数最低的元素zrank获取元素在zset中的排名(按分数从小到大)zrevrank获取元素在zset中的排名(按分数从大到小)zscore获取元素在zset中的分数zrem移除zset中的一个或多个元素zremrangebyrank移除zset中给定排名区间的元素zremrangebyscore移除zset中给定分数区间的元素zincrby增长zset中元素的分数zinterstore盘算两个或多个zset的交集,并将结果存储在新的zset中zunionstore盘算两个或多个zset的并集,并将结果存储在新的zset中
内部编码

ziplist

当有序聚集的元素个数小于zset-max-ziplist-entries设置(默认128个),同时每个元素的值都⼩于zset-max-ziplist-value设置(默认64字节)时,Redis会用ziplist来作为有序聚集的内部实现,ziplist可以有用镌汰内存的使⽤。

skiplist

当ziplist条件不满⾜时,有序聚集会利用skiplist作为内部实现,由于此时ziplist的利用服从会降落。
跳表是一种搜刮布局,搜刮时间复杂度为O(lgN),与均衡二叉搜刮树是一个级别。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表