Redis学习笔记(五) 压缩列表

压缩列表是列表键与哈希键的底层实现之一。当一个列表键只包含少许的列表项,而且每一个列表项要么就是小整数值,要么就是长度较短的字符串,那么Redis就会使用压缩列表来作列表键的底层实现。数组

压缩列表是为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表能够包含任意多的节点,每一个节点能够保存一个字节数组或一个整数值。数据结构

压缩表能够包含:学习

一、长度小于等于63字节的字节数组编码

二、长度小于16383字节的字节数组设计

三、长度小于等于4294967295字节的字节数组blog

四、4位长度的无符号整数内存

五、1字节长度有符号整数开发

六、3字节长的有符号整数字符串

七、int16类型的整数io

八、int32类型的整数

九、int64类型的整数

 

每一个压缩列表节点都由previous_entry_length、encoding、content三部分组成

说明:previous_entry_length 保存前一节点的长度,若是前一个节点长度小于254节点,那么previous_entry_length属性须要1字节长的空间来保存这个长度值;若是超度254则须要5个字节长的空间来保存这个长度。

 

连锁更新

因为是连续的内存片断,当在中间插入一个元素时,

 

e1节点的 previous_entry_length属性仅长1字节,当将new节点设置为前置节点时,因为e1的previous_entry_length 长度为1没法保存new节点的长度,因此须要将长度扩展到5个字节空间,所以须要对列表进行空间从新分配操做。同理,若是引起了对e二、e3.。。。的扩展,这种操做称为连锁更新。

连锁更新在最坏的状况下须要对压缩列表执行n次空间的重分配操做,每次空间重分配的最坏复杂度为O(N),因此连锁更新最坏的的复杂度为O(N2)。

 

-------- end --------

天天学一点,总会有收获。

说明:尊重做者知识产权,文中内容参考《Redis设计与实现》,仅在此作学习与你们分享。

 

相关文章
相关标签/搜索