Redis ZSet(有序集合)底层数据结构

目录

一、核心两种底层结构

[1. 压缩列表(ziplist)](#1. 压缩列表(ziplist))

[2. 跳表(skiplist)+ 哈希表(dict)](#2. 跳表(skiplist)+ 哈希表(dict))

[(1)跳表 skiplist](#(1)跳表 skiplist)

[(2)字典 dict(哈希表)](#(2)字典 dict(哈希表))

二、总结一句话

补充


Redis ZSet 同时使用两种结构配合实现,根据元素数量和元素大小自动切换:

一、核心两种底层结构

1. 压缩列表(ziplist)

触发条件(同时满足):

  1. 集合元素数量 ≤ 128 (默认阈值 zset-max-ziplist-entries)
  2. 每个元素的 member + score 总字节 ≤ 64 字节 (默认阈值 zset-max-ziplist-value)

特点:

  • 连续内存存储,内存占用小、读写快
  • 每个节点同时保存 score 和 member,按 score 有序排列

2. 跳表(skiplist)+ 哈希表(dict)

触发条件:元素数量 / 元素大小 超出上面两个阈值,自动转为该组合结构。

(1)跳表 skiplist
  • 作用 :保证有序、支持范围查询 (ZRANGE/ZREVRANGE/ 区间遍历)
  • 按 score 升序排序,多层索引结构,平衡树的简易替代,增删改查时间复杂度 O (log n)
  • Redis 跳表最大层数固定为 32 层
(2)字典 dict(哈希表)
  • 作用 :O (1) 快速查 score
  • Key = member,Value = score
  • 用来实现 ZSCORE、ZREM 等单成员快速操作

二、总结一句话

  • 小数据量 / 小元素 :只用 压缩列表 ziplist
  • 大数据量 / 大元素 :跳表 (skiplist) + 哈希表 (dict) 双结构协作

补充

Redis 跳表不使用红黑树:跳表实现更简单、无锁并发友好、区间遍历性能更强,完全适配 ZSet 场景。

相关推荐
David猪大卫2 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
这个DBA有点耶2 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风2 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio2 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
vvilkim3 小时前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
虹科网络安全6 小时前
Search on Flex:用分层存储承载更大规模的 Redis 搜索索引
经验分享·redis·艾体宝·艾体宝it
数据库急诊室_阿哲6 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋7 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子8 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
阿卡好可爱8 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua