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

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

文章目录

  • 存储结构
    • 字节数组结构
    • 节点结构
  • 压缩编码
    • 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结构时,看了很多文章都是过于八股,没有一篇文章讲的是明白的,所以还是建议大家带着怀疑的心态学习。
最后,有任何疑问或不同意见,欢迎留言讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一. demo

1. 舞台-场景-控件 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.stage.Stage;import java.util.Arrays;public class Main e…

数据结构(算法竞赛、蓝桥杯)--线段树+懒标记

1、B站视频链接:C02【模板】线段树懒标记 Luogu P3372 线段树 1_哔哩哔哩_bilibili 题目链接:P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) void build(int p,int l,int r){tr[p]{l,r,w[l],0};if(lr)return;//叶子节点返回int…

快速搭建keepalived+nginx

1.工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面…

蓝桥杯《修剪灌木》

题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会…

Java 中常用的数据结构类 API

目录 常用数据结构API 对应的线程安全的api 高可用衡量标准 常用数据结构API ArrayList: 实现了动态数组,允许快速随机访问元素。 import java.util.ArrayList; LinkedList: 实现了双向链表,适用于频繁插入和删除操作。 import java.util.LinkedLis…

【MySQL面试复习】详细说下事务的特性

系列文章目录 在MySQL中,如何定位慢查询? 发现了某个SQL语句执行很慢,如何进行分析? 了解过索引吗?(索引的底层原理)/B 树和B树的区别是什么? 什么是聚簇索引(聚集索引)和非聚簇索引…

【泰山派RK3566】智能语音助手(一)移植Kaldi语音转文字

文章目录 移植过程硬件资源下载测试 移植过程 参考我的这篇博客 【RV1126】移植kaldi实时语音识别 硬件 资源下载 链接:https://pan.baidu.com/s/1x1udT5eNzzQHoPOTCQ182A?pwdlief 提取码:lief –来自百度网盘超级会员V6的分享 下载的文件里面有一个…

leetcode:46.全排列

1.什么是排列? 有顺序!! 2.树形结构: 使用used数组进行标记取过的元素,一个元素一个元素地进行取值,取完之后将used数组进行标记。 3.代码实现:(循环从i0开始,而不是…

区分服务 DiffServ

目录 区分服务 DiffServ 区分服务的基本概念 区分服务 DiffServ 的要点 每跳行为 PHB DiffServ 定义的两种 PHB 区分服务 DiffServ 区分服务的基本概念 由于综合服务 IntServ 和资源预留协议 RSVP 都较复杂,很难在大规模的网络中实现,因此 IET…

C#常识篇(二)

委托和事件的区别 委托可以认为是对指定签名的函数的引用,通过委托可以实现将函数作为参数传递或者间接调用函数,委托是类型安全的,仅指向与其声明时指定签名相匹配的函数。委托可以分为单播委托和多播委托,二者的区别在于是对单个…

IO 作业 24/2/26

1>思维导图 1> 使用消息队列完成两个进程间相互通信 #include<myhead.h> //定义一个消息类型 struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文 }; //定义一个宏&#xff0c;表示消息正文大小 #define MSGSIZE sizeof(struct msgbuf…

深入理解计算机系统学习笔记

2.3整数运算 有时候会发现两个正数相加会得出一个负数&#xff0c;而比较表达式x<y和比较表达式x-y<0会产生不同的结果。这些属性是由于计算机运算的有限性造成的。理解计算机运算的细微之处能够帮助程序员编写更可靠的代码。 2 .3. 1 无符号加法 原理&#xff1a; 在正…

【技术分享】使用nginx完成动静分离➕集成SpringSession➕集成sentinel➕集成seata

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于技术点的相关分享吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一、 使用nginx完成动静分离 1.下载…

c语言经典测试题5

1.题1 t0; while(printf("*")) { t; if (t<3) break; }关于上述代码描述正确的是&#xff1f; A: 其中循环控制表达式与0等价 B: 其中循环控制表达式与0等价 C: 其中循环控制表达式是不合法的 D: 以上说法都不对 我们来分析一下&#xff1a;printf的返回值…

mac 安装hbuilderx

下载 HBuilderX下载地址: 下载地址 选额mac版本点击下载 安装 如图&#xff0c;将HBuilderX拖到Applications&#xff0c;才是正确的安装姿势。 MacOSX&#xff0c;软件必须安装到/Applications目录&#xff0c;如未安装到此目录&#xff0c;可能会出现插件安装失败、项目创建…

使用Django的admin功能管理数据_vscode

之前的文章 项目 hello_django, app名 hello&#xff0c;已有的model LogMessage&#xff1a; https://blog.csdn.net/weixin_44741835/article/details/136202771?spm1001.2014.3001.5502 参考得到电子书&#xff1a;第八章。 https://www.dedao.cn/ebook/reader?idrEQKv6…

深入理解指针2

各位小伙伴们&#xff0c;我们继续来学习指针&#xff0c;指针和结构体以及动态内存管理对后面的数据结构学习有非常大的帮助&#xff0c;所有我们一定要把这些知识点学会。OK,正式进入学习之旅吧 1.数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这…

thinkphp+vue+mysql学生宿舍水电费报修管理系统 0s7h5

本文首先实现了学生宿舍管理系统技术的发展随后依照传统的软件开发流程&#xff0c;最先为系统挑选适用的言语和软件开发平台&#xff0c;依据需求分析开展控制模块制做和数据库查询构造设计&#xff0c;随后依据系统整体功能模块的设计&#xff0c;制作系统的功能模块图、E-R图…

BL、万科、中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉、中国建筑校招笔试题

为了帮助应聘者更好地备战地产公司的招聘考试&#xff0c;我将介绍以下13套校招试题资料&#xff0c;涵盖了24 BL、24万科、24中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉和中国建筑等知名房地产企业&#xff0c;为您提供全方位的备考资源…

(Linux学习一):Mac安装vmWare11.5,centOS 7安装步骤教程

一。下载vmware 官网地址&#xff1a;下载地址 由于我的电脑系统是Mac 10.15.6版本系统&#xff0c;我下载的是VMware Fusion 11.5版本&#xff0c;13是最新版本不支持安装需要系统在11以上。 百度网盘下载地址: VMware Fusion 11 VMware Fusion 12 VMware Fusion 13 下载需要…