引子
Q1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低
A1:限制ZipList的长度和entry大小
Q2:存储大量数据,超出了ZipList最佳的上限
A2:创建多个ZipList来分片存储数据
Q3:数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系
A3:Redis引入了新的数据结构QuickList,它是一个双端链表,只不过链表中的每个节点都是一个ZipList
QuickList
为了避免QuickList中的每个ZipList中entry过多,Redis提供了一个配置项:list-max-ziplist-size来限制。
- 如果值为正,则代表ZipList的允许的entry个数的最大值
- 如果值为负,则代表ZipList的最大内存大小,分5种情况:
- -1:每个ZipList的内存占用不能超过4kb
- -2:每个ZipList的内存占用不能超过8kb
- -3:每个ZipList的内存占用不能超过16kb
- -4:每个ZipList的内存占用不能超过32kb
- -5:每个ZipList的内存占用不能超过64kb
其默认值为 -2
除了控制ZipList的大小,QuickList还可以对节点的ZipList做压缩。通过配置项list-compress-depth来控制。因为链表一般都是从首尾访问较多,所以首尾是不压缩的。这个参数是控制首尾不压缩的节点个数:
- 0:特殊值,代表不压缩
- 1:标示QuickList的首尾各有1个节点不压缩,中间节点压缩
- 2:标示QuickList的首尾各有2个节点不压缩,中间节点压缩
- 以此类推
默认值为 0
整体结构
