目录
[1. 压缩列表(ziplist)](#1. 压缩列表(ziplist))
[2. 跳表(skiplist)+ 哈希表(dict)](#2. 跳表(skiplist)+ 哈希表(dict))
[(1)跳表 skiplist](#(1)跳表 skiplist)
[(2)字典 dict(哈希表)](#(2)字典 dict(哈希表))
Redis ZSet 同时使用两种结构配合实现,根据元素数量和元素大小自动切换:
一、核心两种底层结构
1. 压缩列表(ziplist)
触发条件(同时满足):
- 集合元素数量 ≤ 128 (默认阈值
zset-max-ziplist-entries) - 每个元素的
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 场景。