List-存储原理(quicklist)

在早期的版本中,数据量较小时用ziplist 存储,达到临界值时转换为linkedlist 进行存储,分别对应OBJ_ENCODING_ZIPLIST 和OBJ_ENCODING_LINKEDLIST 。

3.2 版本之后,统一用quicklist 来存储。quicklist 存储了一个双向链表,每个节点都是一个ziplist。

127.0.0.1:6379> object encoding queue
"quicklist"

quicklist

quicklist(快速列表)是ziplist 和linkedlist 的结合体。

quicklist.h,head 和tail 指向双向列表的表头和表尾

typedef struct quicklist {
	quicklistNode *head; /* 指向双向列表的表头*/
	quicklistNode *tail; /* 指向双向列表的表尾*/
	unsigned long count; /* 所有的ziplist 中一共存了多少个元素*/
	unsigned long len; /* 双向链表的长度,node 的数量*/
	int fill : 16; /* fill factor for individual nodes */
	unsigned int compress : 16; /* 压缩深度,0:不压缩; */
} quicklist;

redis.conf 相关参数:

参数含义
list-max-ziplist-size(fill)正数表示单个ziplist 最多所包含的entry 个数。
负数代表单个ziplist 的大小,默认8k。
-1:4KB;-2:8KB;-3:16KB;-4:32KB;-5:64KB
list-compress-depth(compress)压缩深度,默认是0。
1:首尾的ziplist 不压缩;2:首尾第一第二个ziplist 不压缩,以此类推

 

 

 

 

 

 

quicklistNode 中的*zl 指向一个ziplist,一个ziplist 可以存放多个元素。

typedef struct quicklistNode {
	struct quicklistNode *prev; /* 前一个节点*/
	struct quicklistNode *next; /* 后一个节点*/
	unsigned char *zl; /* 指向实际的ziplist */
	unsigned int sz; /* 当前ziplist 占用多少字节*/
	unsigned int count : 16; /* 当前ziplist 中存储了多少个元素,占16bit(下同),最大65536 个*/
	unsigned int encoding : 2; /* 是否采用了LZF 压缩算法压缩节点,1:RAW 2:LZF */
	unsigned int container : 2; /* 2:ziplist,未来可能支持其他结构存储*/
	unsigned int recompress : 1; /* 当前ziplist 是不是已经被解压出来作临时使用*/
	unsigned int attempted_compress : 1; /* 测试用*/
	unsigned int extra : 10; /* 预留给未来使用*/
} quicklistNode;

ziplist 的结构前面已经说过了,不再重复。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值