redis中zset的作用是什么

2023-05-11,

这篇文章给大家介绍redis中zset的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1. zset是什么?  

        在redis官网(https://redis.io/)上,我们可以看到 set, sorted set。其实zset就是sorted set。为了避免sorted set简写sset导致命令冲突,所以改为zset。同理例如class-->clazz

        sorted set从字面意思上,很容易就可以理解,是个有序且不可重复的数据集合。类似set和hash的混合体,但是相比于set,zset内部由score进行排序.

2. zset中的score排序规则 

  • 升序排列,分值越大越靠后

  • 分值相同,则按照value的字典顺序排序      

3. zset的用法

zset的命令可在这里(http://www.redis.cn/commands.html#sorted_set)看到,有兴趣的同学可以直接去看。

ZADD key score1 value1 score2 value2........

即表示增加是的score和value 组,可同时增加多个

 4. zset实现

在redis.conf中,有如下两个参数:

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

这两个条件均不满足,使用 ziplist压缩表来实现sorted set

满足这两个条件之一,sorted set的内部实现会由ziplist转换为zset

zset-max-ziplist-entries 128,即sorted set中的元素对超过128时(存储的是score和value的元素对,所以数据项是256),内部实现会由ziplist转换为zset。

zset-max-ziplist-value 64,即任意一个value的长度超过了64字节,内部实现会由ziplist转换为zset.

zset由 dict、skiplist实现。

5. ziplist,即压缩列表

压缩列表是由连续性内存组成的顺序性数据结构,一个压缩列表可以包含任意多的entry,每个entry可以保存一个字节数组或者一个整数。

压缩列表在表头有三个字段:zlbytes,zltail,zllen分别表示列表长度(整个列表占用的字节数),列表尾的偏移量(尾节点距离起始地址的字节数)和列表中entry的个数。

列表表尾还有一个zlend,表示列表结束了。

6. skiplist

由上图压缩列表可知,如果我们查找第一个元素或者最后一个元素,直接通过表头三个字段的长度可定位。复杂度是O(1),而如果查找其他元素,只能顺序查找,复杂度是O(n)。 为了解决这个问题,可以使用跳表。

跳表是在链表的基础上,增加了多级索引。如下图(图片来源:极客时间),为了提高查询速度,增加了一级索引。为了再次提高查询速度,还可以继续增加二级索引。查找过程就是在多级索引上跳跃,最终定位到元素。  

在新增节点之前,也会先经过查询,确定插入位置,再完成插入操作,同时也实现了 Sorted Set 的排序。

跳表中新增加节点不会影响其他节点的索引位置。因此插入操作只需要修改插入节点前后的指针,不需要修改所有节点,降低了插入的复杂度,所以跳表在插入性能上明显优于平衡树。

 7. zset的使用场景

  • 需要排序的场景,比如top10的热点文章,或者排行榜

  • 消息的延迟发送,用score存储发送时间戳,定时任务扫描sorted set,判断时间进行发送。

关于redis中zset的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

《redis中zset的作用是什么.doc》

下载本文的Word格式文档,以方便收藏与打印。