| 类型(Type key) | 存储编码(OBJECT encoding key) | 实例命令 |
|---|
| list | quicklist是Redis 3.2中新引入的数据结构,能够在时间效率和空间 效率间实现较好的折中。Redis中对quciklist的注释为A doubly linked list of ziplists。顾名思义,quicklist是一个双向链表,链表中的每个节点是 一个ziplist结构。quicklist可以看成是用双向链表将若干小型的ziplist连 接到一起组成的一种数据结构。当ziplist节点个数过多,quicklist退化 为双向链表,一个极端的情况就是每个ziplist节点只包含一个entry,即 只有一个元素。当ziplist元素个数过少时,quicklist可退化为ziplist,一 种极端的情况就是quicklist中只有一个ziplist节点 | lpush queue a b c d e |
存储原理
typedef struct quicklist {
quicklistNode *head;
quicklistNode *tail;
unsigned long count;
unsigned long len;
int fill : 16;
unsigned int compress : 16;
} quicklist;
| 属性 | 说明 |
|---|
| head | 指向quicklist的首节点 |
| tail | 指向quicklist的尾节点 |
| count | count为quicklist中元素entry的总数和 |
| len | 为quicklist Node(节点)个数 |
| fill | 当fill为正数时,表明每个(单个) ziplist最多含有的数据项数,最大值为 2的15次幂 当fill为负数时: -1: 每个quicklistNode节点的ziplist字节大小不能超过4kb。(建议) -2 :每个quicklistNode节点的ziplist字节大小不能超过8kb。(默认配置) -3 :每个quicklistNode节点的ziplist字节大小不能超过16kb。(一般不建议) -4 :每个quicklistNode节点的ziplist字节大小不能超过32kb。(不建议) -5 :每个quicklistNode节点的ziplist字节大小不能超过64kb。(正常工作量不建议) fill取负数时,必须大于等于-5。我们可以通 过Redis修改参数list-max-ziplist-size配置节点所占内存大小。实际上每 个ziplist节点所占的内存会在该值上下浮动 |
| compress | 考虑quicklistNode节点个 数较多时,我们经常访问的是两端的数据,为了进一步节省空间,Redis允许对中间的quicklistNode节点进行压缩,通过修改参数list- compress-depth进行配置 0 表示不压缩。(默认) 1 表示quicklist列表的两端各有1个节点不压缩,中间的节点压缩。 2 表示quicklist列表的两端各有2个节点不压缩,中间的节点压缩。 3 表示quicklist列表的两端各有3个节点不压缩,中间的节点压缩。 以此类推,最大为 2的16次幂 |
typedef struct quicklistNode {
struct quicklistNode *prev;
struct quicklistNode *next;
unsigned char *zl;
unsigned int sz;
unsigned int count : 16;
unsigned int encoding : 2;
unsigned int container : 2;
unsigned int recompress : 1;
unsigned int attempted_compress : 1;
unsigned int extra : 10;
} quicklistNode;
| 属性 | 说明 |
|---|
| prev | prev指向该节点的前节点 |
| next | next指向该节点的后节点 |
| zl | zl指向该节点对应的ziplist结构 不设置压缩数据参数recompress时指向一个ziplist结构 设置压缩数据参数recompress指向quicklistLZF结构 |
| sz | sz代表整个ziplist结构的大小 |
| count | ziplist中包的节点数,占16 bits长度 |
| encoding | 表示是否采用了LZF压缩算法压缩quicklist节点,1表示压缩过,2表示没压缩,占2 bits长度 |
| container | 表示一个quicklistNode节点是否采用ziplist结构保存数据,2表示压缩了,1表示没压缩,默认是2,占2bits长度 |
| recompress | recompress代表这个节点之前是否是压缩节点,若是,则在使用压缩节点前先进行解压缩,使用后需要重新压缩,如果recompress为1,则等待被再次压缩 |
| attempted_compress | 测试时使用 |
| extra | 额外扩展位(预留),占10bits长度 |
typedef struct quicklistLZF {
unsigned int sz;
char compressed[];
} quicklistLZF;
typedef struct quicklistEntry {
const quicklist *quicklist;
quicklistNode *node;
unsigned char *zi;
unsigned char *value;
long long longval;
unsigned int sz;
int offset;
} quicklistEntry;
typedef struct quicklistIter {
const quicklist *quicklist;
quicklistNode *current;
unsigned char *zi;
long offset;
int direction;
} quicklistIter;
typedef struct zlentry {
unsigned int prevrawlensize;
unsigned int prevrawlen;
unsigned int lensize;
unsigned int len;
unsigned int headersize;
unsigned char encoding;
unsigned char *p;
} zlentry;

应用场景
\