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

特点

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

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

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

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

二、总结一句话

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

补充

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

相关推荐
渣渣盟1 小时前
MySQL DQL全面解析:从入门到精通
数据库·sql·mysql·dql
这个DBA有点耶2 小时前
InnoDB架构深潜:从磁盘到内存,一条SQL的生命周期
数据库·mysql·程序员
南境十里·墨染春水2 小时前
数据结构 --- 红黑树
数据结构
小小龙学IT4 小时前
Drizzle ORM:TypeScript 生态中冉冉升起的数据库工具链引言
javascript·数据库·typescript
Zhang~Ling5 小时前
C++ 红黑树封装:myset和mymap的底层实现
开发语言·数据结构·c++·算法
ECT-OS-JiuHuaShan5 小时前
什么是对和错?——“有针对性定义域的逻辑值的真伪”:认识论终极追问的公理化裁决
数据库·人工智能·算法·机器学习·数学建模
啦啦啦啦啦zzzz5 小时前
数据结构:堆排序
数据结构·c++·
乐维_lwops5 小时前
多类型数据库如何高效监控?
数据库·数据库监控·运维监控
齐潇宇5 小时前
Redis数据库基础
linux·数据库·redis·缓存