一.前言:ZipList出现的问题
QuickList的出现是为了解决ZipList所存在的一些问题
1.寻找大内存块,申请内存效率低
ZipList所申请的是连续的内存空间,如果ZipList里面存放的数据过多,就需要一块很大的连续内存,系统需要在物理内存中找到足够大的连续空闲块,大块内存的分配和释放可能导致内存碎片化问题。即使系统中总体上有足够的空闲内存,但这些内存可能分布在不同的位置,形成了碎片。如果没有足够大的连续空间来满足大块内存的需求,系统可能需要进行内存整理操作,以便在物理内存中找到足够大的连续块。这会引入额外的开销。
解决:必须限制ZipList的长度和entry的数量
2.所要存的数据超过了ZipList的最佳存储量
限制了ZipList的长度和entry的数量后,要是要存储大量数据,超过了限制,怎么办
解决:创建多个ZipList来分片存储数据
3.多个ZipList如何建立联系?
数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?
解决:使用双端链表,每个节点都是一个ZipList
二.QuickList
QuickList的每个节点是一个ZipList
1.QuickList的list-max-ziplist-size来控制ZipList的大小
2.QuickList的list-compress-depth来控制对ZipList的压缩
3.QuickList的源码
4.QuickList的结构
5.总结:QuickList结合了链表和ZipList的优点
链表的存储空间十分大,因为地址不需要连续,但缺点是会产生很多内存碎片
而ZipList内存占用少,产生的内存碎片少,缺点是存储量少