redis用了很久,对五种数据结构的使用很熟悉,但是缺乏对实现的认知。所以趁有时间,仔细学习和梳理了下。
List类型的value对象内部是以linkedlist和ziplist承载。当List的元素个数和单个元素的长度较小时,redis会使用ziplist存储,减少内存的占用,其他情况使用linkedlist。
linkedlist是以双向链表形式实现list的存储,所以pop、push等操作的复杂度都是O(1)。Lindex类的复杂度是O(n)。
ziplist顾名思义有压缩的作用,但是单个元素长度较大时,压缩开销会再增加,所以不适用。同时ziplist使用的是连续内存,且由于其数据结构,其操作的复杂度会高于linkedlist(如LPUSH/LPOP等),所以个数较多时也不会使用。ziplist采用可变长度的压缩方法,针对较小的整数、较短的string有较好的压缩效果
ziplist的列表结构
<zlbytes><zltail><zllen><entry><entry><entry>...<zlend>
zlbytes表示list总长度;
zltail指向最末元素,由于ziplist使用的是连续内存,所以zltail的值是最末元素距离ziplist的偏移量;
zllen表示元素个数;
entry是元素自身内容;
zlend恒为0XFF作为ziplist的定界符。
元素结构:
(1)相邻的前一个entry长度
(2)自描述的本entry内容。包括类型长度和内容本身部分。
版权声明:本文为weixin_42578444原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。