Redis的压缩列表是什么?
作者:程序员马丁
note
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
答题思路
回答话术
Redis 的压缩列表是List、Hash 和 ZSet 这三种数据结构的底层实现之一。它由一段连续的内存块组成,每一小段内存都对应一个节点。相对传统的链表,它不使用指针而使用内存偏移量记录节点间的相对关系。
1. 结构特点
压缩列表的头部记录了占用内存大小、尾节点位置与节点总数,而每个节点都记录了上一节点长度、编码格式和数据。这种简洁而紧凑的结构使其可以使用尽可能小的内存存尽可能多的数据,并且仍具备传统链表的正向与逆向遍历功能。
2. 连锁更新
压缩列表的最大问题在于,当修改节点时需要一并修改后继节点记录的前驱节点的长度,当长度超过编码类型所支持的最大数值时,后继节点也需要重新分配内存以改变编码类型。依次类推,就会导致连锁更新。
3. 紧凑列表
为了解决连锁更新问题,Redis 在后续计划引入紧凑列表(listpack)替代压缩列表。它与压缩列表一样,都是基于一块连续的内存实现的有序列表,但是它的节点只记录当前节点的长度,而不记录前驱节点长度。因此修改节点并不会触发连锁更新。