redis数据结构之压缩列表


Posted in Redis onMarch 21, 2022
目录

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现

当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。

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

ziplist 数据结构:压缩列表各个组成部分

redis数据结构之压缩列表

压缩列表各个组成部分详细说明:

redis数据结构之压缩列表

压缩列表节点的构成:

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

长度小于等于63字节的字节数组

长度小于等于16383字节的字节数组

长度小于等于4294967295字节的字节数组

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

  • 1:  4位长介于0至12之间的无符号整数
  • 2:1字节长的有符号整数
  • 3: 3字节长的有符号整数
  • 4:int16类型整数
  • 5:int32类型整数
  • 6 : int64类型整数

压缩列表的数据结构:

redis数据结构之压缩列表

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

创建一个空的ziplist:

/*
 * 新创建一个空 ziplist
 * 
 * 复杂度:O(1)
 *
 * 返回值:新创建的 ziplist
 */
unsigned char *ziplistNew(void) {
    // 分配 2 个 32 bit,一个 16 bit,以及一个 8 bit
    // 分别用于 <zlbytes><zltail><zllen> 和 <zlend>
    unsigned int bytes = ZIPLIST_HEADER_SIZE+1;
    unsigned char *zl = zmalloc(bytes);

    // 设置长度
    ZIPLIST_BYTES(zl) = intrev32ifbe(bytes);

    // 设置表尾偏移量
    ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(ZIPLIST_HEADER_SIZE);

    // 设置列表项数量
    ZIPLIST_LENGTH(zl) = 0;

    // 设置表尾标识
    zl[bytes-1] = ZIP_END;

    return zl;
}

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

压缩列表组成部分:

  • zlbytes:记录整个压缩列表占用的内存字节数
  • zltail:记录压缩列表表尾节点距离压缩列表的起始地址的字节数
  • entryX:列表节点
  • zlend:用于标记压缩列表的末端

压缩列表节点的构成:

  • preivous_entry_length:记录压缩列表中前一个节点的长度
  • encoding:记录节点content属性保存数据的类型以及长度
  • content:负责保存节点的值,值的类型和长度由节点的encoding属性决定。

当我们知道一个指向某个节点起始地址的指针,那么通过这个指针以及这个节点的preivous_entry_length属性,我们可以一直向前一个节点回溯,最终到达压缩列表的表头节点。

连锁更新:

每个节点的preivous_entry_length属性记录前一个节点的长度

如果前一个节点长度小于254字节,preivous_entry_length属性需要用1字节长的空间来保存这个长度值

如果前一个节点长度大于等于254字节,preivous_entry_length属性需要用5字节长的空间来保存这个长度值

如果前一个节点长度变大,这个节点的preivous_entry_length就要扩展,这个节点的扩展引起下一个节点的扩展,这就是连锁更新

redis将这种在特殊情况下产生的连续多次空间扩展操作称之为连锁更新

在添加新节点和删除节点都可能引发连锁更新。

连锁更新最坏情况下需要对压缩列表进行N次空间重分配操作,每次空间重分配的最坏复杂度为O(N),所以连锁更新的最坏复杂度为O(N的平方),平均复杂度为O(N)

总结:

压缩列表是为了节约内存而开发的顺序型数据结构,它是列表键和哈希键的底层实现之一,压缩列表可以包含多个节点,每个节点可以保存一个字节数组或整数值,添加新节点或删除节点可能引发连锁更新操作,这种操作出现几率不高。

到此这篇关于redis数据结构之压缩列表 的文章就介绍到这了,更多相关redis压缩列表 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis 限制内存使用大小的实现
May 08 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
使用RedisTemplat实现简单的分布式锁
Nov 20 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
Apr 07 Redis
详解Redis的三种常用的缓存读写策略步骤
May 06 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
Redis高可用集群redis-cluster详解
使用Redis实现点赞取消点赞的详细代码
Mar 20 #Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
You might like
中英文字符串翻转函数
2008/12/09 PHP
php 邮件发送问题解决
2014/03/22 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
javascript实现的DES加密示例
2013/10/30 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
react以create-react-app为基础创建项目
2018/03/14 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
小程序实现录音功能
2020/09/22 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
Vue实现todo应用的示例
2021/02/20 Vue.js
Python字符串中查找子串小技巧
2015/04/10 Python
python3 读写文件换行符的方法
2018/04/09 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
实例代码讲解Python 线程池
2020/08/24 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
记账会计岗位职责
2014/06/16 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
英语辞职信怎么写
2015/02/28 职场文书
教师调动申请报告
2015/05/18 职场文书
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python