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><zltail><zllen><entry><entry><entry>...<zlend>

zlbytes表示list总长度;

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

zllen表示元素个数;

entry是元素自身内容;

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

元素结构:

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

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值