redis(6)压缩列表

1、压缩列表(ziplist) 是列表键和hash键的底层实现之一,当列表建存储小的整数值,或者长度较短的字符串redis就会使用压缩列表,当一个hash键值对,键和值要么是小整数值要么是长度较短的字符串,那么redis就会使用压缩列表来底层实现

2、压缩列表底层构成


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、压缩列表节点的构成

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字节之间的节点,其次,即使出现连锁更新,但是更新的节点数量不多,不会造成任何性能影响

你可能感兴趣的:(redis(6)压缩列表)