redis(6)压缩列表

1、压缩列表(ziplist) 是列表键和hash键的底层实现之一,当列表建存储小的整数值,或者长度较短的字符串redis就会使用压缩列表,当一个hash键值对,键和值要么是小整数值要么是长度较短的字符串,那么redis就会使用压缩列表来底层实现

2、压缩列表底层构成


2.1、压缩列表是为节约内存开发,是由一系列特殊编码连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点保存一个字节数组或者一个整数值

2.2、zblbytes unit_32_t 4字节,记录整个压缩列表占用内存字节数:在对压缩列表进行内存重分配,或者计算zlend的位置时使用

zltail unit_32_t 4字节 记录压缩列表表尾节点距离压缩列表起始地址有多少字节:通过这个偏移量,程序无须遍历整个压缩列表就能确定压缩列表 尾节点的地址

zllen int_16 2字节 记录压缩列表节点数量,当数值=65535时,依然要遍历列表才能计算出来

entryX 列表节点 节点的长度由节点保存的内容决定

zlend int_8 1字节 特殊值0xFF 十进制255,用于标记压缩列表末端

3、压缩列表节点的构成

3.1、每个压缩列表节点可以保存一个字节数组或者一个整数值,字节数组以下三种长度的一种

长度小于等于63(2的6次方-1)字节的字节数组

长度小于等于16383(2的14次方-1)字节的字节数组

长度小于等于4294967295(2的32次方-1)字节的字节数组

整数值以下六中长度

4位长,0-12之间无符号整数

1字节 3字节 int_16 int_32 int_64

每个压缩列表由previous_entry_length encoding content三部分组成

3.2、previous_entry_length属性以字节为单位,记录前一个节点长度,比如前一个节点长度254,则属性值字节长度1字节,大于254,则为5字节其中属性第一个字节为254,之后四字节用于保存前一个节点的长度,可以更加方便计算前一个节点的起始位置

3.3、encoding 记录节点的content属性所保存数据类型和长度

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

4、连锁更新,由于字节数变更,导致连续多次空间扩展操作称为连续更新,添加或者删除节点都可能引发连锁更新,连锁更新最坏情况下,需要n次空间重分配操作,每次空间分配最坏复杂度o(N)所以连锁更新最坏复杂度o(n)

几率很低

发生条件,多个连续的,长度结余250和253字节之间的节点,其次,即使出现连锁更新,但是更新的节点数量不多,不会造成任何性能影响

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 构成 压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequentia...
    来年花惜阅读 6,655评论 0 2
  • 一、概念 压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项, 并且每个列表项...
    Vic_is_new_Here阅读 5,355评论 0 1
  • 一、整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且元素数量不多,Red...
    稻壳_be03阅读 4,123评论 0 0
  • 一、String 1.1.数据结构 注:数组大小=len+free+1(字符的‘\0’休止符) 1.2.空间分配策...
    爱情小傻蛋阅读 5,678评论 2 0
  • 勒皮他的君主遗憾地没有做到使臣民一心,服从自己的统治。可见,他的统治手法并不高明。此国的法律带有不可理喻的意...
    邢咏仪阅读 3,785评论 0 1