Redis设计与实现---压缩列表ziplist

本文深入解析压缩列表这一高效数据结构,介绍其作为Redis中列表键和哈希键底层实现之一的特点。文章阐述了压缩列表的节点结构,包括previous_entry_length和encoding属性的作用,以及content字段如何保存字节数组或整数值。同时,讨论了压缩列表在进行节点增删时可能触发的连锁更新现象及其触发条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

压缩列表是列表键和哈希键底层实现之一。

一、压缩列表结构

例:

entry结构:

previous_entry_length:该属性以字节为单位,可以是1字节或者5字节,记录了压缩列表中前一个节点的长度。

1字节:前一节点的长度小于254字节。

5字节:前一节点长度大于等于254字节;其中第一字节会被设置为0xFE(十进制254),之后的四个字节用于保存前一节点的长度。

encoding:记录了节点content属性所保存数据的类型以及长度。

1字节、2字节、5字节:最高位为00、01、10的是字节数组编码,表示content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录。

1字节:最高位是11的是整数编码,表示content保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录。

content:保存节点的值,值是一个字节数组或者整数,值得类型和长度由节点的encoding属性决定。

二、

连锁更新(触发概率低)

新增或删除节点时,previous_entry_length从1字节扩展到5字节,而引起一系列的节点重新分配空间。

触发条件:

1)压缩列表中有多个连续的、长度介于250字节至253字节之间的节点

2)新增或者删除节点

如图:

 

重点回顾:

1、压缩列表是一种为节约内存而开发的顺序型数据结构。

2、压缩列表被用作列表键和哈希键的底层实现之一。

3、压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值。

4、添加或删除压缩列表中节点时,可能会引发连锁更新操作,但这种操作出现的几率并不高(触发条件不好满足)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值