redis的list存储对象实现

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表示list总长度;

zltail指向最末元素,由于ziplist使用的是连续内存,所以zltail的值是最末元素距离ziplist的偏移量;

zllen表示元素个数;

entry是元素自身内容;

zlend恒为0XFF作为ziplist的定界符。

元素结构:

(1)相邻的前一个entry长度

(2)自描述的本entry内容。包括类型长度和内容本身部分。



你可能感兴趣的:(cache)