【Redis】快速列表结构
目录
- 1、背景
- 2、压缩列表
- 【1】底层结构
- 【2】特性
- 【3】优缺点
1、背景
redis的quicklist(快速列表)是一个双向链表,其中每个节点都是一个ziplist(压缩列表)。这中结构结合了双向链表和压缩列表的优点,在内存使用和性能之间取得了平衡,接下来就来熟悉一下redis(6.2.18版本)的底层结构实现。
2、压缩列表
【1】底层结构
quicklist的底层结构如下:
typedef struct quicklist {quicklistNode *head; //指向头部节点quicklistNode *tail; //指向尾部节点unsigned long count; //所有ziplist中的条目总数unsigned long len; //quicklist节点数量int fill : QL_FILL_BITS; //单个ziplist的最大大小限制unsigned int compress : QL_COMP_BITS; //不压缩的节点深度unsigned int bookmark_count: QL_BM_BITS;quicklistBookmark bookmarks[];
} quicklist;typedef struct quicklistNode {struct quicklistNode *prev; //上一个节点指针struct quicklistNode *next; //下一个节点指针unsigned char *zl; //指向压缩列表的指针unsigned int sz; //ziplist的字节大小unsigned int count : 16; //ziplist中的条目数unsigned int encoding : 2; /* RAW==1 or LZF==2 */unsigned int container : 2; /* NONE==1 or ZIPLIST==2 */unsigned int recompress : 1; //是否被压缩过unsigned int attempted_compress : 1; /* node can't compress; too small */unsigned int extra : 10; //保留位
} quicklistNode;
向quicklist添加一个元素的时候,不会像普通的链表那样直接新建一个链表节点,而是会检查插入位置的压缩列表是否能够容纳该元素,如果能容纳就直接保存到quicklistNode结构里的压缩列表里,如果不能容纳,才会建一个新的quicklistNode结构。
【2】特性
quick的特性如下:
特性 | 描述 |
---|---|
数据结构 | 双向链表 + 压缩列表的混合结构 |
节点存储 | 每个节点存储一个压缩列表 |
内存效率 | 通过压缩列表减少元素的内存开销 |
可配置性 | 可配置单个ziplist的最大大小和压缩深度 |
灵活性 | 支持从头部和尾部插入/删除 |
压缩支持 | 可选择对中间节点进行压缩 |
【3】优缺点
优点 | 缺点 |
---|---|
内存使用效率高,特别是对小元素 | 随机访问性能不如数组结构 |
插入和删除操作高效 | 需要维护更复杂的结构 |
支持大列表的分片存储 | 配置不当可能导致性能下降 |
可配置的压缩策略平衡内存和cpu | 压缩和解压缩需要额外cpu开销 |
保留了双向链表的灵活性 | 节点分裂和合并可能增加复杂度 |