1、压缩列表(ziplist) 是列表键和hash键的底层实现之一,当列表建存储小的整数值,或者长度较短的字符串redis就会使用压缩列表,当一个hash键值对,键和值要么是小整数值要么是长度较短的字符串,那么redis就会使用压缩列表来底层实现
2、压缩列表底层构成
![](https://img.haomeiwen.com/i13381325/1832bc5806b5d3f7.jpg)
2.1、压缩列表是为节约内存开发,是由一系列特殊编码连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点保存一个字节数组或者一个整数值
2.2、zblbytes unit_32_t 4字节,记录整个压缩列表占用内存字节数:在对压缩列表进行内存重分配,或者计算zlend的位置时使用
zltail unit_32_t 4字节 记录压缩列表表尾节点距离压缩列表起始地址有多少字节:通过这个偏移量,程序无须遍历整个压缩列表就能确定压缩列表 尾节点的地址
zllen int_16 2字节 记录压缩列表节点数量,当数值=65535时,依然要遍历列表才能计算出来
entryX 列表节点 节点的长度由节点保存的内容决定
zlend int_8 1字节 特殊值0xFF 十进制255,用于标记压缩列表末端
3、压缩列表节点的构成
![](https://img.haomeiwen.com/i13381325/89732bfc193e1eda.jpg)
3.1、每个压缩列表节点可以保存一个字节数组或者一个整数值,字节数组以下三种长度的一种
长度小于等于63(2的6次方-1)字节的字节数组
长度小于等于16383(2的14次方-1)字节的字节数组
长度小于等于4294967295(2的32次方-1)字节的字节数组
整数值以下六中长度
4位长,0-12之间无符号整数
1字节 3字节 int_16 int_32 int_64
每个压缩列表由previous_entry_length encoding content三部分组成
3.2、previous_entry_length属性以字节为单位,记录前一个节点长度,比如前一个节点长度254,则属性值字节长度1字节,大于254,则为5字节其中属性第一个字节为254,之后四字节用于保存前一个节点的长度,可以更加方便计算前一个节点的起始位置
3.3、encoding 记录节点的content属性所保存数据类型和长度
3.4、content 保存节点值,可以是一个字节数组或者整数,值的类型和长度由节点的encoding属性决定
4、连锁更新,由于字节数变更,导致连续多次空间扩展操作称为连续更新,添加或者删除节点都可能引发连锁更新,连锁更新最坏情况下,需要n次空间重分配操作,每次空间分配最坏复杂度o(N)所以连锁更新最坏复杂度o(n)
几率很低
发生条件,多个连续的,长度结余250和253字节之间的节点,其次,即使出现连锁更新,但是更新的节点数量不多,不会造成任何性能影响
网友评论