压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少许列表项,而且每一个列表项是小整数或者短字符串,那么Redis会使用压缩列表来做为底层的实现。数组
压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。数据结构
<zlbytes><zltail><zllen><entry><entry><zlend>ui
每一个节点,都有previous_entry_length、encoding、content三个部分组成:编码
5. zlend表示压缩列表的结尾,默认值为0xFF,1字节spa
连锁更新是指一种极端的环境下,添加或删除节点形成后面的节点都须要进行空间重分配的状况。ip
假设有种极端状况,列表有N个节点,每一个节点的previous_entry_length长度都在250~253字节之间(首节点除外,previous_entry_length为0),即这N个节点的previous_entry_length都是1字节编码,这时有一个长度大于253字节的节点插入到表头,因为以前的表头previous_entry_length为0,且只有1字节长度,没法表示大于253字节的数,因此须要进行空间重分配,将previous_entry_length扩展为5字节。内存
这时候因为原首节点(e1)previous_entry_length扩张,致使总体长度扩张增长了4字节,后面一个节点(e2)的previous_entry_length也要相应增长4,e2的previous_entry_length也须要从1字节扩张到5字节,这个扩张将会逐一影响后面的每一个节点都进行previous_entry_length的扩张,这种现象就叫作连锁更新,因此最坏时间复杂度为O(N^2);开发
还有一种状况即为N个节点除首节点外previous_entry_length都是5字节,长度都为254~257,当删除首节点,也会形成一种连锁收缩状况,这种也叫连锁更新。字符串
因为连锁更新的出现须要至关特殊的状况,因此压缩链表添加,删除操做的时间平均复杂度平均仍然是O(N),能够放心使用。io