在本文中,我们介绍一个Redis内部数据结构——quicklist。Redis对外暴露的list数据类型,它底层实现所依赖的内部数据结构就是quicklist。
我们在讨论中还会涉及到两个Redis配置(在redis.conf中的ADVANCED CONFIG部分):
list-max-ziplist-size -2
list-compress-depth 0
我们在讨论中会详细解释这两个配置的含义。
注:本文讨论的quicklist实现基于Redis源码的3.2分支。
quicklist概述
Redis对外暴露的上层list数据类型,经常被用作队列使用。比如它支持的如下一些操作:
lpush: 在左侧(即列表头部)插入数据。
rpop: 在右侧(即列表尾部)删除数据。
rpush: 在右侧(即列表尾部)插入数据。
lpop: 在左侧(即列表头部)删除数据。
这些操作都是O(1)时间复杂度的。
一、基本结构#
quicklist 实际上是 zipList 和 linkedList 的混合体,它将 linkedList 按段切分,每一段使用 zipList 来紧凑存储,多个 zipList 之间使用双向指针串接起来。
typedef struct quicklistNode {
struct quicklistNode *prev; //上一个node节点
struct quicklistNode *next; //下一个node
unsigned char *zl; //保存的数据 压缩前ziplist 压缩后压缩的数据
unsigned int sz; /* ziplist size in bytes */
unsigned int count