it编程 > 数据库 > Redis

Redis Zset的实现原理详解

86人参与 2026-08-28 Redis

zset = 跳表(skiplist) + 哈希表(dict),两套结构同时保存一份数据。

数据特点:成员member唯一不重复,每个member绑定一个分数score,按照score排序。

1. 两个底层结构各自职责

  1. skiplist 跳表
  1. dict 哈希表

插入的时候dict先判断member是否已经存在,实现去重。

⚠️两份结构存的是同一份数据,内存会有少量额外开销,换取查询性能。

2. ziplist 压缩列表(小zset)

当满足两个条件,zset不使用跳表,改用ziplist压缩列表存储:

  1. 元素数量 < zset‑max‑ziplist‑entries 默认128
  2. 每个元素大小 < zset‑max‑ziplist‑value 默认64字节

ziplist是连续内存,节约内存;内部按score有序排列。
一旦超过阈值,自动转换为 skiplist + dict

3. 核心命令底层怎么走

4. 业务场景

面试常见坑

  1. score可以相同:多个member允许分数一样;score相同会按member字典序排序。
  2. zset没有给member单独过期的能力,只能对整个zset key设置expire。
  3. 不要存超大zset,zrange返回大量数据会阻塞redis。

总结:
zset底层分两种情况,少量短元素用ziplist压缩列表;数据量大则采用跳表+哈希表组合。跳表负责排序和范围查询,哈希表实现快速取score和去重。

口述简短版:
redis的zset,数据少的时候用压缩列表。数据量大是跳表加上哈希表一起实现。跳表负责按照score排序,用来做排行榜、范围查询;哈希表用来快速拿到成员的分数,保证成员不重复。注意成员唯一,分数可以重复。

拓展:zset 是什么,和 set 有什么区别

zset 全称 sorted set(有序集合),是 redis 五种核心数据类型之一。它在普通 set 的基础上增加了一个 score(分数)参数,让集合中的元素能按分数自动排序 。‌‌‌

到此这篇关于redis zset的实现原理详解的文章就介绍到这了,更多相关redis zset原理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Redis Ziplist压缩列表的实现

08-28

Redis中EXPIREAT命令实现

08-28

NGINX白名单的几种方法实现

08-29

Redis中GET命令的实现

08-27

Redis会话机制和JWT机制深度解析

08-27

Redis键值存储的实现示例

08-31

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论