redis源码学习--数据结构:ziplist设计

redis源码学习–数据结构:ziplist设计

ziplist的重点在于压缩,为了高效使用内存,需要对数据结构进行压缩。链表结构理论上需要有额外的空间存储指针字段,所以ziplist实际上用的是连续内存。

下面介绍ziplist的结构

字段长度解释
zlbytes占4个字节表示整块结构的长度,包含自己
zltail占4个字节从头到最后一个元素的偏移地址,可以方便的从后遍历
zllen占2个字节表示元素的个数,可以超过全F表示超过了65535,数量需要自己从大头到尾数
entry不确定元素1
entry不确定元素2
还是元素
entry不确定最后一个元素
zlend占用1个字节结束符,固定255

entry的结构如下:

字段长度解释
prevlen占1个字节或者5个字节表示前一个entry占用的字节数,长度小于254(0xFE)用1个字节表示,否则用5个字节。当使用5个字节表示时,第一个字节固定为0xFE,用其余的4个字节表示长度。
encoding不确定表示编码格式,第一个字节的高两bit用来区分数据内容是string还是int。11表示是int,否则都是string
entry-data不确定表示编码后的值

下面详细说明encoding:

高bit类型占用长度解释
00string1个字节string长度用剩下的6bit,长度使用的是大端序,下同
01string2个字节string长度用剩下的14bit
10string5个字节string长度用剩下的32bit
1100000016位int4个字节编码使用1字节,数值占用3字节
1101000032位int5个字节编码使用1字节,数值占用4字节
1110000064位int9个字节编码使用1字节,数值占用8字节
1111000024位int3个字节编码使用1字节,数值占用3字节
111111108位int2个字节编码使用1字节,数值占用1字节
1111XXXX4位int1个字节编码和数值共占1位,XXXX表示具体的数据,范围0到12。使用0001表示数值0,1101表示数据12。由于末尾结束符为11111111,所以1111不能被使用。11110000和11111110都有含义,所以只能表示0到12.

下面这个例子应该比较容易看懂

[0f 00 00 00][0c 00 00 00][02 00][00 f3][02 f6][ff]
zlbytes 总占内存15字节zltail 偏移12entries 元素数量2int 2int 5end

下面的例子是在int 5之后插入一个字符串“hello world”(不包含结束符)的entry的内存结构

020b48 65 6c 6c 6f 20 57 6f 72 6c 64
前一个元素是2字节长度高位为00,所以低6位表示字符串长度,b表示11个字节分别是每个字母的ASCII码

整个zlbytes的码流:

[1c 00 00 00][0e 00 00 00][03 00][00 f3][02 f6][02 0b 48 65 6c 6c 6f 20 57 6f 72 6c 64][ff]
zlbytes 总占内存28字节zltail 偏移14entries 元素数量3int 2int 5hello worldend

至此,我们已经学完了ziplist的编码原理和数据结构的设计,下一篇我们继续学习其代码实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值