Quicklist是Redis3.2之后引入的一个双向链表结构,其本质是对ziplist弊端的一个优化数据结构,ziplist是一种连续的内存空间,用于减少碎片化,减少内存占用,但是正是因为需要连续的内存空间,当数量越来越大时,导致内存空间申请效率很低。
为了缓解这种问题,就通过限制ziplist的大小以及数据分片的思想来优化,使用多个ziplist结构来存储。而quicklist就是用于管理这些分片ziplist的数据结构。
优化1 :Ziplist限制
为了避免ziplist中的entry数量过多,Redis提供了相关配置用于线程quicklist中ziplist大小,配置项 list-max-ziplist-size :
- 如果为正 ,则代表Ziplist的entry允许的最大个数。
- 如果为负,则代表Ziplist的最大内存大小,5种情况:(默认-2)
- -1 :每个ziplist不超过4kb
-2 :每个ziplist不超过8kb
-3 :每个ziplist不超过16kb
-4 :每个ziplist不超过32kb
-5 :每个ziplist不超过64kb
优化2 :Quicklist节点压缩
除了控制Ziplist大小,Quicklist还可以对节点的Ziplist进行压缩,通过配置list-compress-depth来控制。因为链表一般来说首尾访问较多,所以首尾是不压缩的,这个参数是控制首尾不压缩的节点个数。
- 0 :默认值,不压缩。
- 1: 表示Quicklist首尾个1个节点不压缩,中间节点压缩。
- 2: 表示Quicklist首尾个2个节点不压缩,中间节点压缩。
- 以此类推...