当前位置: 首页 > news >正文

实用指南:Redis底层数据结构 -- ziplist, quicklist, skiplist

Redis 底层数据结构学习笔记

(ziplist、quicklist、skiplist)

1. ziplist(压缩列表)

Redis 3.x~5.x 普遍使用的紧凑型线性存储结构,用于存储小数量对象。

用于:


1.1 为什么使用 ziplist?

因为:

  • dict、linkedlist 等结构的指针非常占内存
  • 小数据使用 dict 不划算

ziplist 追求:

空间最节省(compact),连续内存,低开销

1.2 ziplist 的结构图(逻辑)

+----------+----------+----------+-----------+---------+
| zlbytes  | zltail   | zllen    | entries   | zlend   |
+----------+----------+----------+-----------+---------+
字段说明
zlbytesziplist 占用总字节数
zltail最后一个 entry 的偏移量
zllenentry 数量
entries真正的数据
zlend0xFF 标记结束

2.3 entry 的结构

每个 entry 分三部分:

prevlen | encoding | data

意义:

  • prevlen:前一个节点长度(用于快速回退)
  • encoding:整数 or 字符串
  • data:实际内容

2.4 ziplist 的优缺点

优点:

  • 内存占用非常小
  • 结构紧凑
  • 顺序访问速度快

缺点:

  • 插入/删除需要移动内存(O(n))
  • 容易产生连锁更新(prevlen 扩容会导致级联)
  • 不适合大数据量

2. quicklist(快速列表)

Redis 3.2 后为优化 List 结构,引入了 quicklist。

quicklist = 双端链表 + ziplist

每个结点是一个 ziplist,而不是单个元素。


2.1 quicklist 的结构

quicklist
├── quicklistNode → ziplist
├── quicklistNode → ziplist
└── quicklistNode → ziplist

每个 quicklistNode 包含:

previous
next
ziplist 指针
ziplist 长度
ziplist 压缩深度

2.2 设计目的

解决:

  • linkedlist 内存浪费
  • ziplist 修改效率低 之间的矛盾

quicklist:

  • 用链表解决扩容/插入效率问题
  • 每个列表节点又用 ziplist 节省内存

2.3 quicklist 的优点

因此 List 的底层结构(原 linkedlist)被 quicklist 完全替代。


2.4 quicklist 的使用场景

List 类型的底层结构:

  • RPUSH / LPUSH
  • LPOP / RPOP
  • LRANGE

适合大多数队列、栈、日志等业务。


3. skiplist(跳表)

skiplist 是 Redis Sorted Set(ZSet)的底层结构之一。

ZSet 底层 = dict + skiplist


3.1 为什么使用跳表而不是平衡树?

跳表特点:

  • 实现简单
  • 插入删除快速
  • 区间查询高效
  • 在 Redis 单线程中更友好(无需复杂旋转)

时间复杂度:

查找、插入、删除:O(logN)
区间查询:O(logN + m)

4.2 skiplist 结构

包含多个“层级”:

L4:  o-------------o
L3:  o-----o---o---o---o
L2:  o-o-o-o-o-o-o-o-o-o
L1:  o-o-o-o-o-o-o-o-o-o

层级越高节点越少,作为“索引”,类似高速公路。


3.3 skiplist 节点结构

score
member
level[]  // 每层 forward 指针
backward // 后退指针

特点:

  • 多层 forward 提高查找效率
  • backward 用于反向查找

3.4 skiplist 使用场景(ZSet 核心)

  • 排行榜
  • TOP N
  • 时间排序消息流
  • 范围查询(ZRANGE/ZREVRANGE/BYRANK/BYSCORE)

Redis Sorted Set 的高性能就来自 skiplist。


总结表

数据结构底层用途复杂度优点缺点
ziplist小型 List/Hash/ZSetO(n)内存最省插入删除慢
quicklistListO(1)/O(n)ziplist + 链表折中复杂度高
skiplistZSet 排序结构O(logN)区间查询效率高内存比平衡树略大
http://www.jsqmd.com/news/139910/

相关文章:

  • hadoop 分布式集群启动命令 停止命令 hadoop jps查看每个节点状态命令
  • 基于贝叶斯优化的卷积神经网络-门控循环单元回归预测模型及评估指标 - BO-CNN-GRU B...
  • 探秘科立干冰清洗设备:高效靠谱之选 - 工业设备
  • 人工智能领域【专有名词汇总】...补充中...
  • 就想讨点学分有什么不队 - Beta冲刺
  • 科立干冰清洗机:,靠谱之选 - 工业品网
  • 不止溜背好看,这辆新奥迪还藏着“华为大脑”
  • 对比学习:【SimCLR】
  • ADXL345加速度传感器原理图设计,已量产(加速度传感器)
  • 全新帕萨特ePro前瞻:换了新平台、综合续航1300公里
  • 智谱MiniMax竞速上市,字节新模型数学推理突破,清华开源视频生成技术,AI监管政策出台
  • 游戏手柄电池选购指南:品牌、价格与充电方式全解析 - 工业品网
  • Java毕设选题推荐:基于Springboot+Vue的旅游攻略分享平台系统基于VUE的旅游信息分享管理平台【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 对比学习2:【MoCo】
  • 分段存储管理方式学习总结
  • 浅析为什么要用Cursor Commands及在日常开发中如何使用的最佳实践
  • 5、索引的数据结构(b+树,hash)
  • 毕业项目推荐:87-基于yolov8/yolov5/yolo11的血红细胞检测计数系统(Python+卷积神经网络)
  • 元推理框架一次完美的“框架内机器证明”:对莱布尼茨级数的解析
  • 高德地图红绿灯倒计时之实现原理
  • 6、索引算法有哪些?
  • 毕业项目推荐:88-基于yolov8/yolov5/yolo11的昆虫检测识别系统(Python+卷积神经网络)
  • 根据日期编码
  • 如何用Lupa 为Python应用添加脚本支持,以及如何在游戏引擎中调用逻辑
  • LINQ:SelectMany
  • Slabify-et 安装使用(https://github.com/CellArchLab/slabify-et)
  • ARC103B(abc101D)
  • 链表的基本操作,用链表实现线性表
  • 12/25
  • 如何进行 Python 和 Lua 之间的复杂数据交换