ziplist剖析
2022-02-22 15:32:24 0 举报
redis中ziplist底层结构剖析
作者其他创作
大纲/内容
字符串长度在63bytes内,使用这种编码6bits,可以表示的data的长度值 <= 2^6-1=63字节big-endian存储
x
0
q
1
t
字符串长度超过16384bytes后,使用这种encoding这里是4bytes,我少画了2bytes4bytes=32bits,可以表示的data的长度值 <= 2^32-1字节big-endian存储
prevlen
共9bytes,encoding占1bytes,data占8bytes1110表示data部分存储int64_t的integer
p
encoding
6bits无用,填0
4字节(32bit)整个ziplist的字节数
共5bytes,encoding占1bytes,data占4bytes1101表示data部分存储int32_t的integer
字符串encoding第一个字节的前2bit表示存储字符串长度的值的类型000110三种类型
entry1
zllen
integer的encoding第一个byte的前2bit都是1所有的integers都以little-endian表示
4字节(32bit)最后一个entry的offset
entry的两种情况:一种有单独的data,另一种data直接在encoding里面
data
zltail
固定值:0xFF(255)1字节(8bit)
共2bytes,encoding占1bytes,data占1bytes1111表示data部分存储8 bit signed的integer
entry2
zlend
zlbytes
共1bytes,encoding占1bytesdata直接存储在encoding中xxxx可表示的范围0~12从0001(1)到1101(13)所以实际表示值要-10000 和 1110 和 1111三个数被占用了,所以只能表示0-12这13个数
前一个entry的长度<=253时,prevlen为1字节<prevlen from 0 ~ 255>当前一个entry的长度>253时,prevlen有5字节,1字节0xFE(254)表示后面有更大的数,其余4字节用来表示前面的entry的真实大小0xFE<4 bytes unsigned little endian prevlen>
共4bytes,encoding占1bytes,data占3bytes1111表示data部分存储24 bit signed的integer
共3bytes,encoding占1bytes,data占2bytes1100表示data部分存储int16_t的integer
encoding+data部分
字符串长度超过63bytes后,使用这种encoding14bits,可以表示的data的长度值 <= 2^14-1=16384字节big-endian存储
2字节(16bit)整个ziplist中entry的个数个数超过2^16-2(65534)后需要遍历ziplist来获取长度
...
entry3
0 条评论
下一页