Redis 有序集合 Zset的实现原理是什么?

Redis 有序集合 Zset的实现原理是什么?

重要内容

Zset通过两种编码方式实现,根据数据规模动态切换(默认阈值:元素个数 ≤ 128 且 单个元素大小 ≤ 64字节 为小规模数据,只要其中有一个不满足条件,则会切换编码方式)

Ziplist(压缩列表)

适用于小规模数据

  • 结构特点:连续内存存储,每个元素由 value 和 score 成对组成,按 score 升序排列
  • 优势:内存紧凑,无指针开销,适合少量数据的快速顺序访问

Skiplist(跳表)+ Hash(哈希表)

当数据规模超过阈值时自动切换为此结构,兼顾高效的范围查询与单点查找

  • 跳表(Skiplist)

    • 多层链表结构,节点包含多个前向指针(forward)和跨度(span),支持平均 O(logN) 的插入、删除和范围查询

    • 节点层数通过概率算法(如幂次定律)随机生成,高层节点稀疏,加速跳跃式查找

  • 哈希表(Hash)

    • 哈希表结构,存储 value 到 score 的映射,实现 O(1) 的单点查询(如:ZSCORE 命令)

扩展内容

有序集合的插入、删除和查找操作

插入操作

ziplist 插入

  1. 查找位置:遍历找到分值合适的位置 O(N)
  2. 插入数据:将新元素插入对应位置,触发内存重分配和数据移动
  3. 编码转换 :若插入后元素数量或大小超过阈值,转为 skiplist + hash

skiplist + hash 插入

  1. 哈希操作:检查成员是否存在,若存在需先删除旧值 O(1)
  2. 跳表插入
    • 从最高层开始查找插入位置,逐层向下直到最底层 O(logN)
    • 随机生成层高(如抛硬币算法),创建新节点并更新指针
  3. 哈希更新:将 value 到 score 写入哈希表 O(1)
删除操作

ziplist 删除

  1. 查找元素:遍历找到目标成员 O(N)
  2. 数据删除:移除元素并填充空隙,触发内存移动
  3. 编码转换:删除后若数据量过小,可能转回 ziplist

skiplist + dict 删除

  1. 字典查找:通过哈希表快速获取成员分值 O(1)
  2. 跳表删除
    • 从最高层开始查找节点,逐层向下直到最底层 O(logN
    • 调整前后节点的指针,释放节点内存
  3. 字典删除:从哈希表中移除成员 O(1)
查询操作

单点查询(获取分值)

  • ziplist:遍历所有元素 O(N)
  • skiplist + hash:通过哈希表直接获取分值 O(1)

范围查询(如 ZRANGE)

  • ziplist:顺序遍历底层链表 O(M),M为返回元素数
  • skiplist:利用跳表快速定位起始节点,遍历底层链表 O(logN + M)

排名查询(如 ZRANK)

  • ziplist:遍历计数直到找到成员 O(N)
  • skiplist:跳表遍历时累积跨度(span),直接计算排名 O(logN)

性能总结

操作 ziplist skiplist + hash
插入/删除 O(N) O(logN)(跳表)(哈希表 的查询 O(1) 可以忽略)
单点查询分值 O(N) O(1)(哈希表)
范围查询 O(M) O(logN + M)(跳表底层链表)
内存占用 低(连续存储) 较高(指针和哈希表开销)

应用场景

  1. 排行榜 :利用ZRANGEZREVRANGE快速获取排名
  2. 延迟队列 :以时间戳为score,定时扫描到期任务
  3. 实时统计 :如热点文章阅读量排序,通过ZINCRBY更新分值
  4. 范围查询:支持按分值区间快速筛选数据(如成绩分布)
相关推荐
一缕清烟在人间4 分钟前
鸿蒙应用开发实战【27】— DatabaseService 数据库初始化
javascript·数据库·harmonyos·鸿蒙系统
ApacheSeaTunnel31 分钟前
一套替代四套!同程旅行用 Apache SeaTunnel 搭建多模态统一数据通道
大数据·数据库·ai·开源·数据集成·seatunnel·技术分享·数据同步
段一凡-华北理工大学34 分钟前
向量数据库实战:选型、调优与落地~系列文章02:Embedding 嵌入模型选型指南:OpenAI、BGE、Jina、Cohere 横评
大数据·数据库·人工智能·embedding·高炉炼铁·jina·工业智能体
️学习的小王37 分钟前
MySQL 数据库基础操作全解:从建库到增删改查
数据库·mysql·oracle
Spider Cat 蜘蛛猫1 小时前
OIDC 联邦 SSO(复旦 OP / 清华 RP)完整全链路(纯标准OIDC、无User Storage SPI、含用户浏览器操作)
数据库·iam
oradh1 小时前
Oracle 11g单库升级至19c单库(dbua图形方式)
数据库·oracle·11g升级19c·dbua升级方式
王九思1 小时前
对称加密与非对称加密详解
java·网络·数据库
周杰伦的稻香1 小时前
(1071, ‘Specified key was too long; max key length is 767 bytes‘)
数据库·mysql
Leo.yuan2 小时前
数据目录和数据字典有什么区别?一文讲清
大数据·数据库·人工智能
全堆鸿蒙2 小时前
鸿蒙应用开发实战【37】— 数据统计:countByStatus 聚合查询
数据库·华为·harmonyos·鸿蒙系统