86人参与 • 2026-08-28 • Redis
zset = 跳表(skiplist) + 哈希表(dict),两套结构同时保存一份数据。
数据特点:成员member唯一不重复,每个member绑定一个分数score,按照score排序。
score做排序,负责:范围查询、排行榜、倒序、区间分页(zrange、zrevrange、zrangebyscore)插入的时候dict先判断member是否已经存在,实现去重。
⚠️两份结构存的是同一份数据,内存会有少量额外开销,换取查询性能。
当满足两个条件,zset不使用跳表,改用ziplist压缩列表存储:
zset‑max‑ziplist‑entries 默认128zset‑max‑ziplist‑value 默认64字节ziplist是连续内存,节约内存;内部按score有序排列。
一旦超过阈值,自动转换为 skiplist + dict。
zadd key score memberzscore key member:直接查dict哈希表,o(1)返回分数,不走跳表zrange key start end:直接在skiplist做范围遍历 o(log n + k),k是返回元素数量zrange返回大量数据会阻塞redis。总结:
zset底层分两种情况,少量短元素用ziplist压缩列表;数据量大则采用跳表+哈希表组合。跳表负责排序和范围查询,哈希表实现快速取score和去重。
口述简短版:
redis的zset,数据少的时候用压缩列表。数据量大是跳表加上哈希表一起实现。跳表负责按照score排序,用来做排行榜、范围查询;哈希表用来快速拿到成员的分数,保证成员不重复。注意成员唯一,分数可以重复。
拓展:zset 是什么,和 set 有什么区别
zset 全称 sorted set(有序集合),是 redis 五种核心数据类型之一。它在普通 set 的基础上增加了一个 score(分数)参数,让集合中的元素能按分数自动排序 。
到此这篇关于redis zset的实现原理详解的文章就介绍到这了,更多相关redis zset原理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论