Redis Zset的实现原理详解

 更新时间:2026年08月28日 09:04:19   作者:程序员夏洛  
文章浏览阅读94次。ZSet底层分两种情况,少量短元素用ziplist压缩列表;数据量大则采用。

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

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

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

  1. skiplist 跳表
  • 按照score做排序,负责:范围查询、排行榜、倒序、区间分页(zrange、zrevrange、zrangebyscore)
  • Redis的跳表是双向跳表,节点带有back指针,可以高效反向遍历。
  • 平均增删改查 O(log n),最大层数固定32层,节点层数随机生成。
  1. dict 哈希表
  • key:member成员,value:对应的score分数
  • 作用:O(1)时间快速获取某个member的score,判断成员是否存在,保证member唯一性。

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

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

2. ziplist 压缩列表(小zset)

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

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

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

3. 核心命令底层怎么走

  • zadd key score member
  • dict判断member是否存在,存在则更新score;不存在新增
  • 将数据插入跳表,按score维护有序
  • zscore key member:直接查dict哈希表,O(1)返回分数,不走跳表
  • zrange key start end:直接在skiplist做范围遍历 O(log n + k),k是返回元素数量

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(分数)参数,让集合中的元素能按分数自动排序 。‌‌‌

  • ‌核心特性‌:
    • 元素唯一性:和 SET 一样,同一个元素在 ZSET 中只能出现一次。
    • 自动排序:元素按 score 从小到大排列,score 相同时按字典序排序。
    • 分数可重复:不同元素可以有相同的 score 值。
    • 底层实现:小数据量用 listpack(Redis 7.0+)或 ziplist,大数据量用跳表 + 哈希表。‌‌‌
  • ‌与 SET 的关键区别‌:
    • SET 是无序集合,ZSET 是有序集合。
    • SET 只存元素,ZSET 存元素 + 分数。
    • SET 适合去重存储,ZSET 适合排行榜等排序场景。‌‌‌

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

相关文章

  • redis底层数据结构之ziplist实现详解

    redis底层数据结构之ziplist实现详解

    这篇文章主要为大家介绍了redis底层数据结构之ziplist实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Redis列表类型的常用命令小结

    Redis列表类型的常用命令小结

    这篇文章给大家整理了在操作Redis列表类型中的常用命令,文章总结的很全面,对大家学习Redis具有一定的参考借鉴价值,下面来一起看看吧。
    2016-09-09
  • redis事务常用操作详解

    redis事务常用操作详解

    在本篇文章里小编给大家分享了关于redis事务常用操作的相关知识点内容,有兴趣的朋友们可以跟着学习参考下。
    2019-07-07
  • 基于Redis实现的分布式唯一编号生成工具类

    基于Redis实现的分布式唯一编号生成工具类

    这篇文章主要介绍了基于Redis实现的分布式唯一编号生成工具类,核心功能是生成格式为 业务编码+日期+3位自增序号(如 JJ20250826001)的全局唯一编号,适用于分布式系统中需要有序、不重复编号的场景(如订单号、单据号等),以下是详细解析,需要的朋友可以参考下
    2025-11-11
  • Redis分布式锁Redlock的实现

    Redis分布式锁Redlock的实现

    本文主要介绍了Redis分布式锁Redlock的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • redis基本类型和使用方法详解

    redis基本类型和使用方法详解

    这篇文章主要介绍了redis基本类型和使用方法详解,需要的朋友可以参考下
    2020-02-02
  • redis中RDB(Redis Data Base)的机制

    redis中RDB(Redis Data Base)的机制

    本文主要介绍了redis中RDB(Redis Data Base)的机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • redis在Windows中下载及安装、设置教程

    redis在Windows中下载及安装、设置教程

    这篇文章主要介绍了Windows中redis的下载及安装、设置教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Redis键值设计的具体实现

    Redis键值设计的具体实现

    本文主要介绍了Redis键值设计的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Redis中scan命令的深入讲解

    Redis中scan命令的深入讲解

    这篇文章主要给大家介绍了关于Redis中scan命令的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10

最新评论