数据结构
// 快速列表数据结构
struct quicklist {
quicklistNode* head; // 指向快速列表头结点
quicklistNode* tail; // 快速列表尾结点
long count; // 元素总数
int node; // ziplist节点个数
int compressDepth; // 快速列表的压缩深度
}
// 快速列表头结点
struct quicllistNode {
quicklistNode* prev; // 快速列表节点之间通过双向链表的方式连接,故而prev/next分别指向一个头结点的前后节点
quicklistNode* next;
ziplist* zl; // 每个快速列表节点关联一个压缩列表,主要存储数据
int32 size; // ziplist的字节总数
int16 count; // ziplist中的元素数量
int2 encoding; // 2bit表示ziplist是原生字节数组存储,还是LZF压缩存储
}
// ziplist压缩存储时的数据结构
struct ziplist_compressed {
int32 size; // 压缩后的总字节数
byte[] compressed_data; // 存储压缩字节
}
// ziplist
[跳转链接](https://blog.csdn.net/qq_39679639/article/details/122248347?spm=1001.2014.3001.5502)
快速列表的存储结构如图:
其中:
ziplist raw
: 表示当前ziplist使用原生字节数组存储ziplist LZF
: 表示当前ziplist使用LZF压缩之后的存储- quicklist为了保证可以快速从头尾获取/插入数据,head和tail指向的ziplist默认为原生ziplist,中间的ziplist为压缩后ziplist;此时压缩深度为1
- ziplist的默认长度为8KB,如果一个ziplist写满,则需要新建
quicklistNode
和ziplist
快速列表的使用
- 面向用户的数据结构
list
底层通过quicklist
实现