在Redis中,有两种聚集范例,set和zset,此中set是无序聚集,zset是有序聚集,本博客解说Redis中的有序聚集。
在有序聚集中,要按照肯定的指标给聚集元素举行排序,Redis个每个聚集的元素引入了一个score属性,这是一个双精度浮点型,每次排序的时间,依据socre的巨细举行排序。如果分数雷同,那么以字典序排序。
zset下令
ZADD
- 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的元素个数。
ZCOUNT
返回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
- zrange key start stop [withscores]
复制代码 按升序返回[start, stop]区间内的元素,如果带上withscores则将score一起返回。
此处的start和stop不是分数,而是元素的排名,从0开始,支持负数。
示例:
加上withcores参数后,每个元素的下一行是它的socre。
ZREVRANGE
- zrevrange key start stop [withscores]
复制代码 按降序返回[start, stop]区间内的元素,如果带上withscores则将score一起返回。
此处的rev表现reverse翻转,只是将原先的输出次序颠倒了一下,用法和zrange没有区别。
ZRANGEBYSCORE
- zrangebyscore key min max [withscores]
复制代码 按升序返回score在[min, max]区间内的元素,如果带上withscores则将score一起返回。
之前的zrange是通过元素排名返回,zrangebyscore则是通过score区间返回。
示例:
注意:官方文档表明,该下令即将被废弃,而且功能会归并到zrange中。
ZREVRANGEBYSCORE
- zrevrangebyscore key min max [withscores]
复制代码 按降序返回score在[min, max]区间内的元素,如果带上withscores则将score一起返回。
只是将输出次序颠倒了一下,用法和zrangebyscore一样。
注意:官方文档表明,该下令即将被废弃,而且功能会归并到zrevrange中。
ZPOPMAX
返回当前的count个最大元素,而且将这些元素从zset中删除。
示例:
如果多个元素的score雷同,那么会按照member的字典序举行比力,字典序高的先删除。
BZPOPMAX
- 读取并删除zset最大元素,如果没有元素则陷入壅闭
- bzpopmax key [key ...] timeout
复制代码 bzpopmax 可以同时指定多个key,也就是多个zset,只要任何一个zset有数据,就返回结果。还可以设置超时时间timeout,以秒为单元,如果超逾期间了,返回nil。
如果超时时间设置为0,则不停壅闭,不会超时。
示例:
此处启动了两个终端,左侧终端通过bzpopmax读取zset1的最大值。但是由于zset1内没有元素陷入壅闭。不久后在右侧终端插入66 lisa,此时左侧终端检测到后,立即返回结果。zset1表现自己读取到的数据属于哪一个zset,lisa是member,66是score。
ZPOPMIN
返回当前的count个最小元素,而且将这些元素从zset中删除。
BZPOPMIN
- 读取并删除zset最小元素,如果没有元素则陷入壅闭
- bzpopmin key [key ...] timeout
复制代码 bzpopmin 可以同时指定多个key,也就是多个zset,只要任何一个zset有数据,就返回结果。还可以设置超时时间timeout,以秒为单元,如果超逾期间了,返回nil。
如果超时时间设置为0,则不停壅闭,不会超时。
ZRANK
返回指定元素member的排名,这个排名就是socre从小到大的次序,从0开始排,也可以看成下标。
示例:
此处排名最前的是lisa,下标为0。
ZREVRANK
返回指定元素member的排名,这个排名就是socre从大到小的次序,从0开始排。
示例:
ZSCORE
返回指定元素member的分数。
ZREM
- zrem key member [member ...]
复制代码 返回乐成删除的元素个数。
ZREMRANGEBYRANK
- zremrangebyrank key start stop
复制代码 删除排名在[start, stop]闭区间范围内的元素,返回乐成删除的元素个数。
示例:
ZREMRANGEBYSCORE
- zremrangebyscore key min max
复制代码 删除分数在[min, max]闭区间范围内的元素,返回乐成删除的元素个数。
示例:
ZINCRBY
- zincrby key increment member
复制代码 给member的score增长increment的值,返回增长后的结果,increment可以为负值和浮点数。
聚集间利用
在set中,提供了sinter、sunion、sdiff处理处罚交集、并集、差集。那么zset是否也有对应的zinter、zunion、zdiff?是有的,但是在Redis 6.2后才开始支持,在那之前,zset只提供了两个聚集间利用。
ZINRERSTORE
- 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
- 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企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |