北京治疗白癜风医院那家比较好 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/nxbdf/的遗留问题
总结了一个KV数据库的基本架构和Redis的底层数据结构概览,重点总结了SortedSet的两个数据结构的切换,但没有介绍List的两个数据结构的切换,因此本文试着总结一下。
这里先直接给出答案:
从上图可以看到,当List的数据满足下面两个条件时,就会使用压缩列表,否则使用双向链表。
(1)列表对象保存的所有字符串元素的长度都小于64字节;
(2)列表对象保存的元素数量小于个;
这两个参数其实也是可以在redis.conf中修改的:
list-max-ziplist-value64list-max-ziplist-entries
Redis3.2之前的实现
由已经知道,List类型的底层实现包括了双向链表和压缩列表,但这是在Redis的3.2版本之前的底层实现。而从Redis3.2版本开始,Redis修改了List的底层实现,将压缩列表和双向链表结合,我们称它为quickList快速列表。
从第一节的内容我们已经知道,当创建一个新的List时,Redis会优先使用压缩列表,然后在有需要的时候,再转成双向链表。
Redis为什么要这么设计呢?
因为,双向链表的内存占用比压缩列表多,而压缩列表的设计初衷就在于节约内存。众所周知,Redis之所以快的原因之一就是它是内存数据库,所有操作都在内存上完成,因此对于内存的占用有要求。
双向链表
压缩列表
画外音:在Redis3.2之前,我们也可以通过命令来验证:
..80.:rpushtestkey"edison""andy""leo"3..80.
bjectencodingtestkeyziplist..80.:rpushtestkey"