Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > Redis ziplist与quicklist

Redis中ziplist与quicklist解析与对比小结

作者:程序员风屿

本文介绍了Redis中List数据类型的两种编码方式ziplist和quicklist,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、背景 — 为什么要有多种“列表(List)”编码

在历史发展中,Redis 对 List 的编码方式经历了如下阶段:

下面分别介绍 ziplist 和 quicklist 的结构与特性,然后比较优缺点。

二、ziplist —— 压缩列表(compact list)

2.1 ziplist 是什么

ziplist结构如图所示,参考Redis面试题:

下边的图也可加深理解

ziplist的各字段含义如下。

对于每一个entry元素来讲

entry 结构包含三个字段:

  1. prelen
    • 记录前一个元素的长度,用于从后向前遍历。
    • 前一个元素长度 < 254B → 占 1B。
    • 前一个元素长度 ≥ 254B → 占 5B(首字节为 0xFE,后 4B 为实际长度)。
  2. encoding
    • 表示 data 的数据类型(整数或字节数组)。
    • 长度可变(1B、2B 或 5B),通过开头的比特区分。
    • 同时可包含字节数组的长度信息(如 6bit、14bit 或 32bit 表示长度)。

以下是encoding字段的元素编码

编码 (encoding) 标识 / 类型encoding长度说明 / 含义 (简要)
00pppppp1B表示一个 string,长度 ≤ 63 字节。
01pppppp + qqqqqqqq2B表示一个 string,长度 ≤ 2¹⁴‑1字节。
10000000 + 4 bytes length5B表示一个较长 string(长度 ≤ 2³²‑1字节)。
110000001B表示一个 int16_t(16-bit 整数)元素。
110100001B表示一个 int32_t(32-bit 整数)元素。
111000001B表示一个 24-bit 整数编码(special 24-bit 整数)。
111111101B表示一个 int8_t(8-bit 整数)元素。
1111xxxx1Bxxxx表示范围为 0–12 的整数 。
  1. data
    • 实际存储的数据,可以是整数或字节数组,长度由 encoding 决定。

2.2 ziplist 的适用条件(默认策略)

在 Redis 配置文件(或编译时默认)中,对于 LIST、HASH、ZSET 等类型,会设置参数来决定是否使用 ziplist,例如:

当元素数量或元素大小超过这些限制时,Redis 会放弃 ziplist 编码,转为其他更适合的编码方式(在老版本可能是 linkedlist,现在是 quicklist)。

2.3 ziplist 的优点与缺点

优点

缺点 / 缺陷

三、quicklist —— 快速列表(QuickList)

3.1 quicklist 是什么

3.2 quicklist 的结构与配置参数

quicklist 的主要结构由 quicklistquicklistNode 两个 C 结构体定义,在 Redis 源码中(例如 quicklist.h / quicklist.c)可以查看。

结构图

在quicklist中,关键字段包括:

⚠️ 注意:在 Redis 最新版本中(例如 7.x),listpack 已经逐步取代 ziplist 作为内部压缩子列表结构,但 quicklist 的设计思想不变 —— 分段 + 链表 + 压缩子列表。

3.3 quicklist 的优点

3.4 quicklist 的限制与注意事项

quicklist 的两种极端情况如下:

1. 当 ziplist 节点过多时,quicklist 退化为双向链表。最极端的情况是每个 ziplist 节点只包含一个 entry,即一个元素对应一个节点。
2. 当 ziplist 节点过少时,quicklist 退化为 ziplist。最极端的情况是整个 quicklist 中只含有一个 ziplist 节点。

四、ziplist vs quicklist —— 对比总结

特性 / 维度ziplistquicklist
内存布局连续内存 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文