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

Chapter7 压缩列表

列表键和哈希键的底层实现之一(列表键只包含少量元素,且元素为小整数或较短字符串;而哈希键之包含少量键值对,且每个键值对的key和value都是小整数或较短字符串)。

为了节约内存。

压缩列表的组成

一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构,包含多个节点entry,每个entry保存一个字节数组或一个整数。

内存组织:

具体含义:

压缩列表节点的组成

每个节点保存一个字节数组或者一个整数值,由 previous_entry_length 、 encoding 、 content 三个部分组成。

保存的字节数组可以是以下三种长度的其中一种:

  1. 长度小于等于 63 (2^{6}-1)字节的字节数组;
  2. 长度小于等于 16383 (2^{14}-1) 字节的字节数组;
  3. 长度小于等于 4294967295 (2^{32}-1)字节的字节数组;

而整数值则可以是以下六种长度的其中一种:

  1. 4 位长,介于 0 至 12 之间的无符号整数;
  2. 1 字节长的有符号整数;
  3. 3 字节长的有符号整数;
  4. int16_t 类型整数;
  5. int32_t 类型整数;
  6. int64_t 类型整数。

节点内存组织:

具体含义:

  • previous_entry_length:前一个节点entry的长度字节数,相当于向前指针;
    • 长度:1或5字节
      • 前一节点长度<254:1字节;
      • 前一节点长度>=254:5字节,且第一字节设为0xFE(即254),后4个字节保存真正的长度数据;
  • encoding:节点content属性所保存数据的类型和长度,根据字节数据和整数两种数据类型可做如下解析

  • content:保存节点真正的数据,由encoding属性决定如何解释;

连锁更新问题

特殊情况:

  • 插入:多个连续的、长度介于250~253字节直接的节点e1至eN(previous_entry_length属性都为1个字节);此时在e1前插入一个长度>=254字节的节点,则需更新e1的previous_entry_length属性(由1字节长度变为5字节),导致e1长度>=254,于是连锁更新e2、e3...eN。
  • 删除:在两个节点big(长度>=254)和small(长度<254)之后紧跟着多个连续的、长度介于250~253字节直接的节点e1至eN(previous_entry_length属性都为1个字节);此时删除small,则需更新e1的previous_entry_length属性(由1字节长度变为5字节),导致e1长度>=254,于是连锁更新e2、e3...eN。

连锁更新最坏情况下需要对压缩列表做N次空间重分配操作,而每次分配的最坏复杂度为O(N),所以连锁更新最坏情况为O(N^2)。但是可预见的是对性能影响不大:

  1. 出现上述两种情况的概率很小;
  2. 即使出现,只要更新的节点不多,性能也不会有影响;
时间: 2024-10-27 16:58:51

Redis设计与实现 - chapter7 压缩列表的相关文章

Redis压缩列表原理与应用分析

摘要 Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件.它支持字符串.列表.哈希表.集合.有序集合五种数据结构类型,同时每种数据结构类型针对不同的应用场景又支持不同的编码方式.这篇文章主要介绍压缩列表编码,在理解压缩列表编码原理的基础上介绍Redis对压缩列表的应用,最后再对Redis压缩列表应用进行分析. 摘要 Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件.它支持字符串.列表.哈希表.集合.有序集合五种数据

【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件里.我把zipmap称作"压缩字典"(不知道这样称呼正不对)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间. zipmap和前面介绍的ziplist结构十分相似,我们能够对照地进行学习: Redis中

【Redis源码剖析】 - Redis内置数据结构值压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件中.我把zipmap称作"压缩字典"(不知道这样称呼正不正确)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间.zipmap和前面介绍的ziplist结构十分类似,我们可以对比地进行学习: Redis中

学习笔记-Redis设计与实现-压缩列表

压缩列表(ziplist)是列表键和哈希键的底层实现之一. 7.1 压缩列表的构成 压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构.一个压缩列表可以包含任意多个节点(entry),每个节点可以保存数组或者一个整数值. 7.2 压缩列表节点的构成 每个压缩列表节点可以保存一个字节数组或者一个整数值. 每个压缩列表节点都由previous_entry_length.encoding.content三个部分组成. 7.2.1 pre

Redis压缩列表

此篇文章是主要介绍Redis在数据存储方面的其中一种方式,压缩列表.本文会介绍1. 压缩列表(ziplist)的使用场景 2.如何达到节约内存的效果?3.压缩列表的存储格式 4. 连锁更新的问题  5. conf文件配置.在实践上的操作主要是对conf配置文件进行配置,具体上没有确切的一个值,更多是经验值.也有的项目会直接使用原本的默认值.此篇对于更好地理解一个数据库底层的存储逻辑会有一点帮助.修学储能,既要博,也要渊.希望这篇文章对同样也是在学习Redis的各位同伴有点用. 一.压缩列表(zi

Redis数据结构之压缩列表

压缩列表是Redis为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型数据结构.一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值. 一.压缩列表结构1. 压缩列表结构: 参数说明:zlbytes:记录整个压缩列表占用的内存字节数.zltail:记录压缩列表表尾节点距离压缩列表起始地址有多少字节.zllen:记录了压缩列表包含的节点数量.entryN:压缩列表的节点,节点长度由节点保存的内容决定.zlend:特殊值0xFF(十进制255),用于标记压缩列表的

redis 底层数据结构 压缩列表 ziplist

当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现. 压缩列表是Redis为了节约内存而开发的是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值 ziplist 数据结构 压缩列表节点的构成 每个压缩列表节点可以保存一个字节数组或者一个整数值,其中字节数组可以是以下三种长度的其中一种 长度小于等于63字节的字节数组 长度小

Redis实现之压缩列表

压缩列表 压缩列表(ziplist)是列表键和哈希键的底层实现之一,当一个列表键只包含少量列表项,并且每个列表项要嘛是整数值,要嘛是比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现.例如,执行以下命令将创建一个压缩列表键的底层实现 127.0.0.1:6379> RPUSH lst 1 3 5 10086 "hello" "world" (integer) 6 127.0.0.1:6379> OBJECT ENCODING lst &q

Redis数据结构之压缩列表-ziplist

为了节约内存,在zset和hash容器对象元素个数较少时,Redis会采用压缩列表(ziplist)进行存储. 压缩列表是一块连续的内存空间,元素之间紧挨着存储,不存在冗余 一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值 结构 // 压缩列表 struct ziplist<T> { int32 zlbytes; // 压缩列表占用的内存字节数 int32 zltail_offset; // 记录表尾节点距离起始地址有多少个字节,用于快速定位最后一个元