bigywater.tech
Redis · 9

List 的 quicklist 结构

把list-max-listpack-size设成128,验证一个list在128个元素时是listpack编码,加第129个元素的瞬间变成quicklist。

128→129
listpack转quicklist的精确边界
链表套小块
quicklist是listpack节点组成的双向链表
单向不可逆
编码只会向更大的结构转换,不会自动缩回

做的事:一个list,盯着它的编码在什么时候变

List类型有两种的底层编码:小的时候是listpack,大的时候是quicklist。

操作CONFIG SET list-max-listpack-size 128 RPUSH 128个元素到ctrllist OBJECT ENCODING ctrllist

验证:128个元素还是listpack,第129个触发转换

精确卡在配置的阈值上测试。

结果RPUSH 128个元素之后: OBJECT ENCODING ctrllist → :listpack LLEN ctrllist → 128 RPUSH 第129个元素之后: OBJECT ENCODING ctrllist → :quicklist LLEN ctrllist → 129

边界精确卡在配置值上:128个元素时还是紧凑的listpack(所有元素存在一段连续内存里),第129个元素一插入,Redis立刻把它转换成了quicklist——一个由多个listpack节点串成的双向链表,每个节点自己是一小段listpack,节点之间用链表指针连起来。

这样设计是为了两头兼顾:list很小的时候(大多数场景),用一整块连续内存的listpack,省内存、访问快;list变大之后,如果还硬塞进一块连续内存,会导致这块内存越来越大、扩容代价越来越高,quicklist把它拆成很多小块,每块独立管理,插入/删除某一段不需要搬动整个list。

分步演示:list编码转换的精确边界

每一步都是本文上面用redis-cli跑出来的原始结果。

listpack精确在128→129这个边界转换成quicklist
这一步新验证的元素数

    本文用到的工具

    • 本机 Redis 8.10.1 单节点
    • OBJECT ENCODING / CONFIG SET list-max-listpack-size:控制并观察编码转换
    京ICP备2026067502号-1京公网安备11010502063487号