32人参与 • 2026-01-07 • Redis
在历史发展中,redis 对 list 的编码方式经历了如下阶段:
下面分别介绍 ziplist 和 quicklist 的结构与特性,然后比较优缺点。
ziplist结构如图所示,参考redis面试题:

下边的图也可加深理解

ziplist的各字段含义如下。
对于每一个entry元素来讲
entry 结构包含三个字段:
以下是encoding字段的元素编码
| 编码 (encoding) 标识 / 类型 | encoding长度 | 说明 / 含义 (简要) |
|---|---|---|
| 00pppppp | 1b | 表示一个 string,长度 ≤ 63 字节。 |
| 01pppppp + qqqqqqqq | 2b | 表示一个 string,长度 ≤ 2¹⁴‑1字节。 |
| 10000000 + 4 bytes length | 5b | 表示一个较长 string(长度 ≤ 2³²‑1字节)。 |
| 11000000 | 1b | 表示一个 int16_t(16-bit 整数)元素。 |
| 11010000 | 1b | 表示一个 int32_t(32-bit 整数)元素。 |
| 11100000 | 1b | 表示一个 24-bit 整数编码(special 24-bit 整数)。 |
| 11111110 | 1b | 表示一个 int8_t(8-bit 整数)元素。 |
| 1111xxxx | 1b | xxxx表示范围为 0–12 的整数 。 |
在 redis 配置文件(或编译时默认)中,对于 list、hash、zset 等类型,会设置参数来决定是否使用 ziplist,例如:
list-max-ziplist-entries:限制 ziplist 中元素(entry)个数list-max-ziplist-value:限制每个 entry 的最大字节数(value 大小)当元素数量或元素大小超过这些限制时,redis 会放弃 ziplist 编码,转为其他更适合的编码方式(在老版本可能是 linkedlist,现在是 quicklist)。
优点:
缺点 / 缺陷:
quicklistnode)内部持有一个 ziplist来存储一段连续的元素。quicklist 的主要结构由 quicklist 和 quicklistnode 两个 c 结构体定义,在 redis 源码中(例如 quicklist.h / quicklist.c)可以查看。
结构图

在quicklist中,关键字段包括:
head / tail:指向链表头尾节点。count:list 中所有元素entry的总数。len:quicklistnode 节点数量。fill:用于控制每个 ziplist 容量上限entry 数量 或 字节大小,通过 list-max-ziplist-size 配置项设定。compress:用于控制压缩深度,即链表两端多少个节点不压缩,中间节点可被压缩以节省内存,通过 list-compress-depth 配置项控制。zl,大小 sz,元素计数 count 等信息。⚠️ 注意:在 redis 最新版本中(例如 7.x),listpack 已经逐步取代 ziplist 作为内部压缩子列表结构,但 quicklist 的设计思想不变 —— 分段 + 链表 + 压缩子列表。
quicklist 的两种极端情况如下:
1. 当 ziplist 节点过多时,quicklist 退化为双向链表。最极端的情况是每个 ziplist 节点只包含一个 entry,即一个元素对应一个节点。
2. 当 ziplist 节点过少时,quicklist 退化为 ziplist。最极端的情况是整个 quicklist 中只含有一个 ziplist 节点。
| 特性 / 维度 | ziplist | quicklist |
|---|---|---|
| 内存布局 | 连续内存 block(compact) | 链表 + 多个 ziplist/listpack segments |
| 内存开销 | 低,连续、紧凑 | 较高(链表+子列表)但比纯链表低 |
| 适合场景 | 元素少、数据小、读不频繁修改 | 元素多、队列 / 栈 / 批量 push/pop / 变长频繁 |
| 插入/删除性能 | 中间插入删除开销大(可能 memcpy) | 头尾 o(1),节点级调整,较稳定 |
| 内存碎片 | 几乎无 | 较少(链表 + 子列表) |
| 压缩 / 节省空间 | 默认紧凑 | 可配置压缩,兼顾效率 |
| redis 中默认支持 | 早期版本 | redis 3.2+ 默认 |
redis 之所以在内存数据库 / 缓存系统中表现出色,很大程度上是因为它为不同场景提供了优化良好的底层数据结构。ziplist 与 quicklist 是 redis list 类型在历史与现在对空间与时间折中的经典设计。
到此这篇关于redis中ziplist与quicklist解析与对比小结的文章就介绍到这了,更多相关redis ziplist与quicklist内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论