点击(此处)折叠或打开
-
/* quicklist.c - A doubly linked list of ziplists
- */
真香!!!貌似这东西是一个双向链表,而链表的每个元素就是之前介绍过的ziplist,这样梳理一下,貌似一个东西刚刚讲过,还热乎,另一个是常规双向链表,有搞头了,嘿嘿嘿~~~
目前来讲的话这边提供了五中数据结构quicklistNode, quicklistLZF, quicklist,quicklistIter, quicklistEntry,它们的具体定义以及说明如下:
quicklistNode
点击(此处)折叠或打开
-
typedef struct quicklistNode {
-
struct quicklistNode *prev;
-
struct quicklistNode *next;
-
unsigned char *zl;
-
unsigned int sz; /* 未被压缩的情况下:ziplist size in bytes */
-
unsigned int count : 16; /* count of items in ziplist */
-
unsigned int encoding : 2; /* RAW==1 or LZF==2 */
-
unsigned int container : 2; /* NONE==1 or ZIPLIST==2 */
-
unsigned int recompress : 1; /* was this node previous compressed? */
-
unsigned int attempted_compress : 1; /* node can't compress; too small */
-
unsigned int extra : 10; /* more bits to steal for future usage */
- } quicklistNode;
字段 | 描述 |
count:16 | ziplist当中的items |
encoding:2 | 这里需要注意的是quicklist会使用一种名叫LZF的压缩算法来对ziplist压缩,如果压缩,该字段值为2;如果不压缩,该字段值为1。算法的具体实现见lzf的3个文件(lzf.h,lzf_c.c, lzf_d.c)。 |
container | 存放数据的容器:1位NONE;2位ziplist,现阶段应该都是这个。 |
recompress:1 | 表示该节点是否为临时解压,若是,稍后会被压缩回去 |
attempted_compress:1 | 节点太小,不能被压缩 |
extra:10 | 保留 |
点击(此处)折叠或打开
-
typedef struct quicklistLZF {
-
unsigned int sz; /* LZF size in bytes*/
-
char compressed[];
- } quicklistLZF;
点击(此处)折叠或打开
-
typedef struct quicklist {
-
quicklistNode *head;
-
quicklistNode *tail;
-
unsigned long count; /* total count of all entries in all ziplists */
-
unsigned long len; /* number of quicklistNodes */
-
int fill : 16; /* 每一个节点中最多包含的元素个数-5到0xFFFF */
-
unsigned int compress : 16; /* depth of end nodes not to compress;0=off */
-
} quicklist;
-
/* Optimization levels for size-based filling */
- static const size_t optimization_level[] = {4096, 8192, 16384, 32768, 65536};
fill值 | 描述 |
整数m | 每个节点上的ziplist最多包含m个数据项 |
n = [-5,-1] | 根据(-n)-1的值来确定下标,取下标对应的optimization_level数组中的元素来当做最大的数据项,默认值为-2 |
剩下的就是quicklistIter和quicklistEntry了,代码如下:
点击(此处)折叠或打开
-
typedef struct quicklistIter {
-
const quicklist *quicklist;
-
quicklistNode *current;
-
unsigned char *zi;
-
long offset; /* offset in current ziplist */
-
int direction;
-
} quicklistIter;
-
-
typedef struct quicklistEntry {
-
const quicklist *quicklist;
-
quicklistNode *node;
-
unsigned char *zi;
-
unsigned char *value;
-
long long longval;
-
unsigned int sz;
-
int offset;
- } quicklistEntry;
点击(此处)折叠或打开
-
#define SIZE_SAFETY_LIMIT 8192
-
#define MIN_COMPRESS_BYTES 48
- #define MIN_COMPRESS_IMPROVE 8
碎碎念在节前:节前是真的心累,各种事情焦头烂额,现在感觉没人报问题反而心里没有底了,真是fo了,不管如何,自己还是要努力向前冲,提前祝大家
新春快乐,年年暴富~~~~~~~~~~