redis数据结构源码分析——压缩列表ziplist(I)

news2025/1/16 11:12:22

前面讲了跳表的源码分析,本篇我们来聊一聊另外一个重点结构——压缩列表

文章目录

  • 存储结构
    • 字节数组结构
    • 节点结构
  • 压缩编码
    • zipEntry
      • zlEntry
    • ZIP_DECODE_PREVLEN
    • ZIP_DECODE_LENGTH
  • API解析
    • ziplistNew(创建压缩列表)
    • ziplistInsert(插入)
    • ziplistDelete(删除)
    • ziplistFind(查找)
  • 压缩列表的设计思想和优势
    • 设计思想
    • 优势

存储结构

字节数组结构

压缩列表就是一个字节数组(char *zl)
有序集合、散列和列表都直接或间接使用到压缩列表
在这里插入图片描述
zlbytes:压缩列表的字节长度
zltail:压缩列表尾元素相对于压缩列表起始地址的偏移量
zllen:压缩列表的元素个数
entry:各个节点
zlend:压缩列表的结尾,占一个字节,一直是0xFF(255)

节点结构

也就是entry里存的是什么
在这里插入图片描述
网上很多这样的图,那么这个结构是哪里来的呢?我们看下源码中的注释:
在这里插入图片描述
prevlen:前一个元素的字节长度
encoding:当前元素的编码,占一个字节,八位。前两位存的是元数据的类型,后六位存的是元数据的长度
entry-data:元数据,也就是当前的内容
prevlen和encoding这两部分是作为元数据的前缀信息。注意!这里的注释说了,通常情况下是这样的结构,但也有其他情况:
在这里插入图片描述
有时候encoding代表entry本身,比如说小整数(0-12),在这种情况下,是没有entry-data的
这里的注释能看出来编码的实际样式,简单翻译一下:

压缩编码

zipEntry

zlEntry

zipEntry解压完后是zlEntry
在这里插入图片描述
prevrawlensize:存储prevrawlen需要的字节数
prevrawlen:前一个节点占用的字节数
lensize:存储len需要的字节数
len:数据长度
headersize:首部长度,等于prevrawlensize + lensize
encoding:当前元素编码
*p:当前元素首地址

ZIP_DECODE_PREVLEN

用来解码prevlen字段
根据注释我们可以了解prevlen
在这里插入图片描述
我们大概翻译一下这里的注释:如果prevlen长度小于254字节,就只消耗单个将长度表示为无符号8位整数的字节。当长度大于或等于254,则它将消耗5个字节。第一个字节是设置为254(FE)以指示后面是更大的值。剩下的4个字节将上一个条目的长度作为值。
我们看下代码:
在这里插入图片描述
其实从这里可以看出,这个值要么是1要么是5.
大概流程可以这样表示:
在这里插入图片描述

ZIP_DECODE_LENGTH

用来解码encoding字段
在这里插入图片描述
这里的代码比较长,但是能看出来,就是根据传入的当前元素和encoding求len和lensize

API解析

这里我们大概讲下以下四个API,后三个插入删除和查找的源码较长,我们本篇只做大概讲解,详细的讲解在这里:redis源码解析——压缩列表ziplist(II)API详解+级联更新

ziplistNew(创建压缩列表)

在这里插入图片描述
这块是比较简单的,大概步骤如下:
1、计算长度
2、根据计算出的长度申请内存(zmalloc方法)
3、各个字段赋初始值
4、返回字节数组的地址
这里的zmalloc方法就是分配内存作用
在这里插入图片描述

ziplistInsert(插入)

在这里插入图片描述
这里的__ziplistInsert方法比较复杂,我们后续可以专门出一篇文章讲解下,这里就做个步骤的大概梳理:
1、编码
2、重新分配空间
3、数据复制

ziplistDelete(删除)

在这里插入图片描述
这里相对于插入来说是比较简单的,不过详细源码解析我们跟插入流程一起出一篇讲解,这里的大概流程为:
1、先计算出要删除的元素的长度
2、数据复制
3、重新分配空间

ziplistFind(查找)

1、计算节点属性
2、判断节点类型
3、如果是字符串,对比内容
4、如果是整数,对比数值
5、找到就返回,找不到就指向下一个

压缩列表的设计思想和优势

设计思想

1、为了节省空间而设计
2、内存是连续的,元素之间没有空隙
3、encoding不仅存类型,也可以存长度
4、不存储前后节点的指针,并不是通过索引来找位置,而是通过长度计算前后节点的位置
5、zlentry的解码存储

优势

1、节省内存,其实也就是以时间换空间。相对来说更适用于比较小的数据或是说比较少的数据量大场景
2、zlentry可以提供快速访问

2023过去了,祝愿各位朋友们2024龙年大吉,技术越来越好,也希望自己在新的一年里技术提升,工作顺利。最近写redis的源码系列看了不少文章,这里给大家提个建议,看到网上的文章或教学时,不要完全的跟着教学走,比如这里的entry结构,一定要带着怀疑的态度自己去翻翻源码,我原本也是看到网上的文章,但是看到entry结构时,看了很多文章都是过于八股,没有一篇文章讲的是明白的,所以还是建议大家带着怀疑的心态学习。
最后,有任何疑问或不同意见,欢迎留言讨论。

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

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

相关文章

.NET Core使用NPOI导出复杂,美观的Excel详解

前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…

第四节:Vben Admin登录对接后端getUserInfo接口

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 文章目录 系列文章目录前言一、回顾Vben…

推荐莹莹API管理系统PHP源码

莹莹API管理系统PHP源码附带两套模板,PHP版本要求为5.6至8.0之间,已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试:宝塔/主机亲测成功搭建! 演示地 址 : runruncode.com/php/19698.html 安装说明(适用于宝…

【经验】J-link v8固件修复

jlink v8 重新烧录解决不识别usb,灯不亮的问题。参考了网上的饿jlink v8固件烧录指导。 打开JLINK后盖,主流的有以下两种结构: 擦除芯片并进入编程模式 1.使用USB线连接JLINK与PC机,以提供JLINK工作电源 2.短接图中ERASE(A)的两…

Excel工作表控件实现滚动按钮效果

实例需求:工作表中有多个Button控件(工作表Form控件)和一个ScrollBar控件(工作表ActiveX控件,名称为ScrollBar2),需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果,实际…

STM32 4位数码管和74HC595

4位数码管 在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共…

Java+SpringBoot+Vue+MySQL:疫情隔离酒店管理的全面技术解决方案

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

有哪些副业渠道?

夸克网盘这个软件出来好久了,官方前不久才开通了推广渠道,这就给了我们以此赚钱的机会。具体时间应该是在2022年12月份。 所谓夸克网盘拉新,就是夸克网盘为了抢占市场,与其他网盘竞争对手(百度网盘、迅雷网盘等&#…

2024-2-23-进程线程的通信作业

1>信号代码 要求: &#xff08;1&#xff09; 源代码: #include <myhead.h> void handler(int signo) {if (signo SIGINT){printf("用户按下了ctrl c键\n");} } int main(int argc, char const *argv[]) {// //忽略// if (signal(SIGINT, SIG_IGN) SI…

AI论文速读 | 【综述】(LLM4TS)大语言模型用于时间序列

题目&#xff1a;Large Language Models for Time Series: A Survey 作者&#xff1a;Xiyuan Zhang , Ranak Roy Chowdhury , Rajesh K. Gupta and Jingbo Shang 机构&#xff1a;加州大学圣地亚哥分校&#xff08;UCSD&#xff09; 网址&#xff1a;https://arxiv.org/abs/…

istio系列教程

istio学习记录——安装https://suxueit.com/article_detail/otVbfI0BWZdDRfKqvP3Gistio学习记录——体验bookinfo及可视化观测https://suxueit.com/article_detail/o9VdfI0BWZdDRfKqlv0r istio学习记录——kiali介绍https://suxueit.com/article_detail/pNVbfY0BWZdDRfKqX_0K …

Gemini 模型将被引入Performance Max

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

计算机设计大赛 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

Python爬虫进阶:爬取在线电视剧信息与高级检索

简介&#xff1a; 本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫&#xff0c;并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据&#xff0c;并使用pandas库来处理和存储检索结果。 目录 一、爬取在线电视剧信息 …

顺序表知识点——顺序表的增删查改

目录 准备文件 创建顺序表蓝图 顺序表初始化函数接口 顺序表的销毁函数接口 顺序表的打印函数接口 顺序表的插入函数接口 顺序表的删除函数接口 从本节开始&#xff0c; 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。 首…

【基于Ubuntu20.04的Autoware.universe安装过程】方案一:虚拟机 | 详细记录 | Vmware | 全过程图文 by.Akaxi

目录 一、Autoware.universe背景 二、虚拟机配置 三、Ubuntu20.04安装 四、GPU显卡安装 五、ROS2-Galactic安装 六、ROS2-dev-tools安装 七、rmw-implementation安装 八、pacmod安装 九、autoware-core安装 十、autoware universe dependencies安装 十一、安装pre-c…

JSONVUE

1.JSON学习 1.概念: JSON是把JS对象变成字符串. 2.作用: 多用于网络中数据传输. JavaScript对象 let person{name:"张三",age:18}//将JS对象转换为 JSON数据let person2JSON{"name":"张三","age":18}; 3.JS对象与JSON字符串转换…

力扣随笔删除有序数组中的重复项(简单26)

思路&#xff1a;根据类似于滑动窗口的思想&#xff0c;定义一个指针&#xff1b;使指针左边的区域全部为不重复元素&#xff08;包括指针所指的数字&#xff09; 以示例2为例&#xff0c;left&#xff1a;红色加粗 遍历指针i&#xff1a;黑色加粗 窗口范围&#xff0c;左边界到…

市场复盘总结 20240223

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 57% 最常用的…

检索增强生成(RAG) — 高级提示工程方法

Thread of Thought&#xff0c;ThoT Thread of Thought Unraveling Chaotic Contexts 大型语言模型&#xff08;LLMs&#xff09;在自然语言处理领域开启了一个变革的时代&#xff0c;在文本理解和生成任务上表现出色。然而&#xff0c;当面对混乱的上下文环境&#xff08;例…