快速列表
Redis早期版本存储list列表数据结构使用的是压缩列表ziplist和普通的双向链表linkedlist,也就是说当元素少时用ziplist,当元素多时用likedlist
考虑到链表的附加空间相对太高,prev和next指针就要占去16个字节,另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理效率,后来的Redis新版本对列表数据结构进行了改造,使用quicklist代替ziplist和linkedlist
quicklist是ziplist和linkedlist的混合体,它将linkedlist按段切分,每一段使用ziplist让存储紧凑,多个ziplist之间使用双向指针串接起来
为了进一步节约空间,Redis还会对ziplist进行压缩存储,使用LZF算法压缩,可以选择压缩深度。
每个ziplist存多少元素
quicklist内部默认单个ziplist长度为8KB,超出这个字节数,就会另起一个ziplist。ziplist的长度由配置参数list-max-ziplist-size决定
压缩深度
quicklist默认的压缩深度是0,也就是不压缩。压缩的实际深度由配置参数list-compress-depth决定。为了支持快速push/pop操作,quicklist的首尾两个ziplist不压缩,此时压缩深度就是1。如果压缩深度为2,就表示quicklist的首尾第一个ziplist以及首尾第二个ziplist都不压缩。