redis原理之底层数据结构(二)-压缩列表

news2024/11/27 6:28:26

1.绪论

压缩列表是redis最底层的结构之一,比如redis中的hash,list在某些场景下使用的都是压缩列表。接下来就让我们看看压缩列表结构究竟是怎样的。

2.ziplist

2.1 ziplist的组成

在低版本中压缩列表是由ziplist实现的,我们来看看他的结构

可以看出压缩列表由如下几个字段组成:
1.zlbytes:4个字节的总长度;
2.zltail: 4个字节最后一个元素的指针;
3.zllen:2个字节总的元素个数;
4.多个entry元素;
5.zlend:压缩列表的结尾标志。

每个entry元素由3部分组:
1.previous_entry_length:1个字节或者5个字节,上一个entry的长度,当上一个元素大小小于255个自己,当前字段为1个字节,当超过255个字节,当前字段为5个字节;
2.encoding:通过1个字节,用来表示存储的内容是什么类型,比如int16或者int32,或者是字符串数组;
3.content:真正存储的内容数据,如果是存储的字符串,会存储字符串的长度和内容。

2.2 ziplist的缺点

2.2.1 连锁更新

ziplist为了解决从节点后向前遍历的问题,所以每个entry都存储了前一个节点的长度previous_entry_length,而redis一直秉持着对节约内存的优秀品质,如果前一个节点的数量小于255个字节,就用1个字节来存储长度,但是大于的话就用5个字节来存储长度。现在假设ziplist有5个entry,而且刚好5个entry的长度254,刚好每个previous_entry_length都是一个字节来存储长度,现在假设第一个entry加了一些数据,导致长度,大于了255个字节,第二个元素的previous_entry_length需要用5个字节来存储前一个元素的长度,导致第二个entry的总长度也增加了,并且超过了255个字节,所以第3个元素的previous_entry_length也需要用5个字节存储上一个元素的长度,依此类推,修改一个元素的内容,需要修改后面所有的元素。这就是连锁更新。

3.listpack

在高版本的redis中,为了解决连锁更新问题,redis采用listpack来实现压缩列表。listpack和ziplist差不多,但是有个区别就是每个entry记录的是本entry的长度,而不是上一个entry的长度,所以每个entry长度的改变只会影响自己,而不会影响到其他的entry。

3.1 listpack的组成


1.tot-bytes:4个字节的总长度
2.num-elements:entry的总个数
3.多个entry
4.end-bytes:1个字节的结束标识


每个entry由3部分组成:
1.encoding:1个字节,用来标识content存储的内容的编码,整数或者字符串
2.content:每个entry存储的内容
3.back-len:当前entry的长度,这是和ziplist的主要区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教学类-67-01】20240715毛毛虫AB排序

背景需求 幼儿园数学区 颜色排序 - 小红书毛毛虫颜色排序 直接打印#幼儿园数学https://www.xiaohongshu.com/explore/63362546000000001d026455?app_platformandroid&ignoreEngagetrue&app_version8.44.1&share_from_user_hiddentrue&xsec_sourceapp_share&a…

Jenkins用户权限管理指定操作任务

安装插件 在 Jenkins 的管理插件中进行插件安装。 搜索插件库:Role-based Authorization Strategy 修改授权策略 在全局安全配置中,把授权策略改为Role-Based Strategy 添加角色规则 在安全中选择Manage and Assign Roles 在Global roles中添加一个…

嵌入式人工智能(2-树莓派4B开发板硬件环境搭建)

1.硬件开发环境(T型板) 树莓派4B开发板需要搭配面包板,T型板将40个GPIO口引出,再将T型板插到面包板上面。这个地方需要注意插接的方向,由于插树莓派引脚的排线没有防呆设计,因此,请注意方向&am…

Centos7 安装私有 Gitlab

在 CentOS 7上,下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问极狐GitLab,则可以跳过它。 sudo yum install -y curl policycoreutils-python openssh-server perl sudo systemct…

免单优选:重塑电商销售新纪元

免单优选作为一种颠覆性的电商销售策略,其核心在于以价格优势为驱动,融合渐进激励与社交网络效应,深度挖掘并激发消费者的购买潜力,引领销售增长的新潮流。 一、合规为基,重塑信任 在免单优选模式中,我们坚…

el-popover或el-popconfirm中button不展示问题

vue3在使用Element-plus 2.X时&#xff0c;出现el-popover或el-popconfirm中button不展示问题。 正常效果&#xff1a; 第一种错误原因&#xff1a;el-button没有添加 slotreference <template slot-scope"scope"><el-popconfirm title"您确定删除吗…

CVE-2024-24549 Apache Tomcat - Denial of Service

https://lists.apache.org/thread/4c50rmomhbbsdgfjsgwlb51xdwfjdcvg Apache Tomcat输入验证错误漏洞&#xff0c;HTTP/2请求的输入验证不正确&#xff0c;会导致拒绝服务&#xff0c;可以借助该漏洞攻击服务器。 https://mvnrepository.com/artifact/org.apache.tomcat.embed/…

【Android】活动之间的穿梭

引入 在活动的初学建立了一个简单的活动&#xff0c;但只有一个活动不是过于简单&#xff0c;在你使用手机的时候按下一个按钮可能会跳转到下一个界面&#xff0c;此时就是活动之间的穿梭&#xff1a;使用Intent在活动之间穿梭 Intent&#xff1a;是android程序中各组件之间进…

【LeetCode力扣】006. Z 字形变换(Python)

最快解法 参考了运行时间最短的代码&#xff0c;其使用的思路就是按列排序后连接。 class Solution:def convert(self, s: str, numRows: int) -> str:if numRows < 2 : # numRows1时候&#xff0c;对应输出为原字符串return sn len(s)lst [ for _ in range(numRows…

andon系统在电力设备工管理中起到那些作用与价值

安灯系统&#xff0c;作为精益制造执行中的一个核心工具&#xff0c;在电力设备工厂车间管理中发挥着不可替代的作用&#xff0c;它能够实现生产透明管理&#xff0c;为工厂高效运作提供强大的支撑。本文将从安灯系统的功能、应用场景和价值三个方面&#xff0c;深入探讨其在电…

如何保证数据库和redis的数据一致性

1、简介 在客户端请求数据时&#xff0c;如果能在缓存中命中数据&#xff0c;那就查询缓存&#xff0c;不用在去查询数据库&#xff0c;从而减轻数据库的压力&#xff0c;提高服务器的性能。 2、问题如何保证两者的一致性 先更新数据库在删除缓存 难点&#xff1a;如何保证…

微信小程序,订阅消息

微信小程序&#xff0c;订阅消息&#xff0c;完整流程 1.选择需要的模版 2.前端调用订阅消息 注&#xff1a;tmplIds&#xff1a;模板ID模版id,这里也可以选多个 wx.requestSubscribeMessage({tmplIds: [7UezzOrfJg_NIYdE1p*******],success (res) { console.log(res);wx.g…

论文阅读:FAST SPECTRAL CLUSTERING WITH SELF-WEIGHTED FEATURES

1 Abstract 作为主流聚类方法之一&#xff0c;谱聚类因其在非线性数据集上的良好性能而越来越受到关注。然而&#xff0c;传统的谱聚类模型计算复杂度高。同时&#xff0c;大多数这些模型在实践中未能区分噪声和有用特征&#xff0c;导致聚类性能受限。在本文中&#xff0c;我…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读、捕获文件格式转换错误ExcelDataConvertException

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

React、Vue的password输入框组件,如何关闭自动填充?

有时候我们的表单使用了一个password组件&#xff0c;这时候每次打开新建&#xff0c;都会自动获取浏览器缓存的密码&#xff0c;但是它的上一个input输入框并不是用户名&#xff0c;这时候我们希望我们的表单&#xff0c;每次点开的时候密码是空的&#xff0c;让用户自动输入&…

windows下通过nginx解压包启动nginx

退出&#xff1a; taskkill /f /t /im nginx.exe 人工智能学习网站 https://chat.xutongbao.top

【ProtoBuf】初识 ProtoBuf

一、序列化概念 1、序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程称为对象的反序列化。 什么情况下需要序列化&#xff1f; 存储数据&#xff1a;当我们想把的内存中的对象状态保存到⼀…

论文翻译:Explainability for Large Language Models: A Survey

https://arxiv.org/pdf/2309.01029 目录 可解释性在大型语言模型中&#xff1a;一项调查摘要1 引言2 LLMs的训练范式2.1 传统微调范式2.2 提示范式 3 传统微调范式的解释3.1 局部解释3.1.1 基于特征归因的解释3.1.2 基于注意力的解释3.1.3 基于示例的解释 3.2 全局解释3.2.1 基…

a newer or same version is present nvidia解决方案

安装时候出现a newer or same version is present nvidia 或者Night Visual Editor 失败&#xff0c;把显卡驱动卸载掉&#xff0c;打开service.mtc 服务控制面板&#xff0c;把nvidia开头的服务全停掉&#xff0c;重新启动cuda安装程序选择自定义安装 vse visual studio相关的…

构建未来智能边缘:4G定制化ARM边缘计算网关解决方案

在当今数字化转型的时代背景下&#xff0c;边缘计算正成为连接物理世界与数字世界的关键桥梁&#xff0c;为企业提供实时数据处理和决策能力。为了满足市场对高性能、灵活且可定制的边缘计算解决方案的需求&#xff0c;一款专为各类品牌量身定制的ARMxy边缘计算网关 产品亮点&…