导航:首页 > 文件处理 > redis压缩存储

redis压缩存储

发布时间:2023-06-14 09:23:26

A. 【Redis】基础数据结构-ziplist压缩列表

压缩列表是列表和哈希表的底层实现之一:

Redis压缩列表是由连续的内存块组成的列表,主要包含以下内容:

列表在初始化的时候会计算需要分配的内存空间大小,然后进行内存分配,之后将内存空间的最后一个字节标记为列表结尾,内存空间的大小计算方式如下:

所以在创建之后,内存布局如下,此时压缩列表中还没有节点:

之后如果如果需要添加节点,会进行移动,为新节点的插入腾出空间,所以还是斗弯余占用的连续的空间:

压缩列表的节点可以存储字符串或者整数类型的值,为了节省内存,它采用了变长的编码方式,压缩列表的节点的结构定义如下:

prevrawlen :存储前一个节点的长度(占用的字节数),这样如果从后向前遍历,只需要当前节点的起始地址减去长度的偏移量prevrawlen就可以定位到上一个节点的位置,prevrawlen的长度可以是1字节或者5字节:

encoding :记录了节点的数据类型和内容的长度,因为压缩列表可以存储字符串或者整型,所以有以下两种情况:

存储内容为整数时,encoding占用1个字节,最高位是11开头,后六位代表整数值的长度,其中当编码为1111xxxx时情况比较特殊,

后四位的值在0001和1101之间, 此时直接代表数据的内容,是0到12之间的一个数字 ,并不是数据长度,因为它代表了数据内容,所以也不需要额外的空间存储数据内容。

zipStoreEntryEncoding

因为压缩列表中每个节点记录了前一个节点的长度:

假设有一种情况,一个压缩列表中,存储了多个长度是253字节的节点,因为节点的长度都在254字节以内,所以每个节点的prevrawlen只需要1个字节去存储长度的值:

此时在列表的头部需要新增加一个节点,并且节点的长度大于254,这个时候原先的头结点entry1 prevrawlen使用1字节已经不能满足当前的情况了,必须要使用5字节存储,因此entry1的prevrawlen变成了5字节,entry1的长度也会跟着增加4个字节,已经超过了254字节,因为大于254就需要使用5个字节存储,所以entry2的prevrawlen也闹李需要改变为5字节,后面的以此类推,引发了连锁更新,这种情况称之为连锁更新:

总结空滚

(1)Redis压缩列表使用了一块连续的内存,来节约内存空间。

(2)压缩列表的节点可以存储字符串或者整数类型的值,它采用了变长的编码方式,根据数据类型的不同以及数据长度的不同,选择不同的编码方式,每种编码占用的字节大小不同,以此来节约内存。

(3)压缩列表的每个节点中存储了前一个节点的字节长度,如果知道某个节点的地址,可以使用地址减去字节长度定位到上一个节点,不过新增节点的时候,由于前一个节点的长度大于254使用5个字节,小于254使用1个字节存储,在一些极端的情况下由于长度的变化会引起连锁更新。

参考

黄健宏《Redis设计与实现》

极客时间 - Redis源码剖析与实战(蒋德钧)

【张铁蕾】Redis内部数据结构详解(4)——ziplist

【_HelloBug】Redis-压缩表-__ziplistInsert详解

图解Redis之数据结构篇——压缩列表

Redis版本:redis-6.2.5

阅读全文

与redis压缩存储相关的资料

热点内容
新工具培根pdf 浏览:991
ftp服务器地址与特定目录之间用什么符号 浏览:143
面包压缩后的体积和密度 浏览:624
浪潮服务器两块sas硬盘如何raid 浏览:93
如何把两个pdf合并成一个 浏览:596
tina怎么编译 浏览:973
java程序员就业方向 浏览:318
androidurl参数解析 浏览:637
空间不足可以一边解压一边删除 浏览:79
淘汰的程序员去干嘛 浏览:905
组合式压缩空气干燥器 浏览:319
渤海信托app为什么注册不了 浏览:629
如何上腾讯轻量云服务器 浏览:450
所有单片机都能烧写吗 浏览:881
怎么找到压缩文件 浏览:494
垃圾压缩站广州 浏览:89
图算法应用场景 浏览:414
把加密电梯卡写入小米手机 浏览:81
dijkstra算法有向图 浏览:558
湖南电信都有什么免流app 浏览:838