Redis数据结构(三):ZipList
ZipList是一种特殊的双端链表(不是链表,但是具备它的特性),由一系列特殊编码的连续内存块组成,可以从两端push/pop,并且该操作复杂度为O(1)
ZipList结构
- zlbytes 4字节 记录整个压缩列表占用的字节数
- zltail 4字节 记录压缩列表尾结点距离压缩列表的起始地址有多少个字节,用来确定尾节点的地址
- zllen 2字节 记录压缩列表包含的节点数量
- entry 列表节点
- zlend 一字节 特殊值 0xFF 标记压缩列表的末端
Entry的结构
- previous_entry_length:前一个节点的长度,如果长度小于254字节,用一个字节就可以表示,如果大于,就用5个字节来表示
- encoding:编码属性
- contents:负责保存节点的数据,可以是字符串或者整数
ZipList连锁更新问题
previous_entry_length记录上一个结点的长度,如果在前边插入一个比较大的节点,而它之后的节点的previous_entry_length正好在254前徘徊,就会导致都扩大成5个字节,这就是连锁更新问题
因为出现概率较低,不考虑
总结
- 压缩列表可以看作一种连续内存空间的双向链表
- 列表的节点之间不是通过指针连接的,而是记录上一个节点和本节点长度来寻址,内存占用较低
- 如果列表数据过多,导致链表过长,肯能影响查询性能
- 增加或较大数据可以发生连续更新问题