前言
QuickList 是针对 ZipList 在设计上的不足而新增的一种数据结构,对 ZipList 数据结构比较陌生的同学可以先学习一下 ZipList 在来学习。
1. ZipList数据结构的不足
- 不能保存过多的元素,否则访问性能会降低
- 不能保存过大的元素,否则容易导致内存重新分配,甚至会引发连锁更新的问题。连锁更新,简单来说,就是 ZipList 中的每一项都要被重新分配内存空间,造成 ZipList 的性能降低
2. QuickList
如果要存储大量数据,超出了 ZipList 最佳的上限,那么可以创建多个 ZipList 来分片存储数据,这多个 ZipList 如何建立联系?
QuickList数据结构是Redis在3.2版本引入的一种新得数据结构,他是一个双端链表,链表中的每个节点都是一个 ZipList,如下图所示
怎么限制每个 ZipKList 的长度和大小?
通过:list-max-ziplist-size 配置项来限制
- 如果值为正,则代表ZipList 的允许的 entry 个数的最大值
- 如果值为负,则代表 ZipList 的允许的最大内存大小,分五种情况(默认值为-2):
-1:每个ZipList的内存占用不能超过4kb
-2:每个ZipList的内存占用不能超过8kb
-3:每个ZipList的内存占用不能超过16kb
-4:每个ZipList的内存占用不能超过32kb
-5:每个ZipList的内存占用不能超过64kb
2.1 QuickList 数据结构
quicklist 源码在 src/quicklist
包中
quicklistNode 源码在src/quicklist
包中
2.2 QuickList 内存结构图
如上图所示,这里配置二咯 compress 为1,说明首尾各有一个节点不进行压缩得,其他节点要进行压缩
3. 总结
QuickList的特点:
- 它是一个节点为ZipList的双端链表
- 每个节点采用ZipList,解决传统链表的内存占用问题
- 控制了 ZipList 的大小,解决连续内存空间申请效率的问题
- 节点可以进行压缩,节省了内存