Redis数据结构 — Listpack

目录

listpack 结构

listpack 节点结构


quicklist 虽然通过控制 quicklistNode 结构里的压缩列表的大小或者元素个数,来减少连锁更新带来的性能影响,但是并没有完全解决连锁更新的问题。

于是,Redis 在 5.0 新设计一个数据结构叫 listpack,目的是替代压缩列表,它最大特点是 listpack 中每个节点不再包含前一个节点的长度,而是记录当前节点的长度。

Listpack源码icon-default.png?t=N6B9https://github.com/redis/redis/blob/unstable/src/listpack.clistpack 结构

listpack 头包含两个属性,分别记录了 listpack 总字节数和元素数量,然后 listpack 末尾也有个结尾标识。图中的 listpack entry 就是 listpack 的节点了,相对于ZipList没有记录,距离尾节点的偏移量,Listpack节省了这部分内存空间

unsigned char *lpNew(size_t capacity) {unsigned char *lp = lp_malloc(capacity > LP_HDR_SIZE+1 ? capacity : LP_HDR_SIZE+1);if (lp == NULL) return NULL;lpSetTotalBytes(lp,LP_HDR_SIZE+1);lpSetNumElements(lp,0);lp[LP_HDR_SIZE] = LP_EOF;return lp;
}

listpack 节点结构

 listpack entry主要包含三个方面内容:

  • encoding,定义该元素的编码类型,会对不同长度的整数和字符串进行编码;
  • data,实际存放的数据;
  • len,encoding+data的总长度;

可以看到,listpack 没有压缩列表中记录前一个节点长度的字段了,listpack 只记录当前节点的长度,当我们向 listpack 加入一个新元素的时候,不会影响其他节点的长度字段的变化,从而避免了压缩列表的连锁更新问题

listpackEntry中的改进 :
不同于ziplist,listpackEntry中的len记录的是当前entry的长度,而非上一个entry的长度。listpackEntry中可存储的为字符串或整型。

  • 当存储的为字符串,那么lsentry的sval不为空,slen记录大小。
  • 当存储的为整型,那么lval记录整型,sval字段为空

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

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

相关文章

(学习笔记)TCP基础知识

什么是TCP? TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一定是[一对一]才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论网络链路中出现了…

mongodb集群搭建

下载地址: https://www.mongodb.com/try/download/community下载mongodb-linux-x86_64-rhel70-5.0.18 搭建集群 tar -zxvf mongodb-linux-x86_64-rhel70-5.0.18.tgz mkdir -p data/dp cd mongodb-linux-x86_64-rhel70-5.0.18 mkdir -p data/db mkdir log mkdir c…

AIGC之文本内容生成概述(下)——Transformer

在上一篇文章中,我们一口气介绍了LSTM、Word2Vec、GloVe、ELMo等四种模型的技术发展,以及每种模型的优缺点与应用场景,全文超过一万字,显得冗长且繁杂,在下文部分我们将分开介绍Transformer、BERT、GPT1/GPT2/GPT3/Cha…

Java:输入与输出

目录 输入输出args 输入Scanner 输入格式化输出文件输入与输出 输入输出 args 输入 利用main函数中的参数args,当然也可以起别的名字。其他语言也是一样的。输入时空格分隔。 args的作用:在程序启动时可以用来指定外部参数 Scanner 输入 需要import j…

JDK、JRE、JVM之间的关系是什么?

目录 JVM、JRE、JDK的关系? JDK、JRE、JVM都是什么? JVM JRE JDK JVM、JRE、JDK的关系? 三者包含关系: JDK>JRE>JVM JDK、JRE、JVM都是什么? jdk:是用于java开发的最小环境 包括:ja…

如何助力企业DCMM贯标落地,这里有答案

DCMM作为国家第一个数据管理领域标准,是企业落实数据驱动战略、实现数字化转型的重要抓手。从行业实践来看,国内多个行业开始在全面拥抱DCMM模型,根据模型开展数据管理评估和能力提升工作。 01 什么是DCMM DCMM是国家标准《GB/T36073-2018 数…

Word文档突然无法打开?如何修复损坏文档?

在工作学习中,通常会遇到这种情况,我们正在编辑Word文件,电脑忽然断电关机,或者死机需要重启。当电脑重启以后,辛辛苦苦编辑很久的Word文件却忽然打不开了!一直提示文件错误,如何解决Word无法打…

postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难

​专栏内容: postgresql内核源码分析 手写数据库toadb 并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 表锁介绍 当表打开,或者操作表时,都需要…

Go速成-常量

1.常量的定义 Go语言常量,定义的值是不能进修修改的,定义常量就是const,常量定义建议全部大写 const PI float32 3.1415946 //显式定义 const (x int 16ys "abc"z)fmt.Print(x,y,s,z) 在定义常量的时候如果没有声明值&#xff…

Gradle和Aritifactory,实现上传Apk并发送消息到钉钉

Gradle和Aritifactory 本文链接:https://blog.csdn.net/feather_wch/article/details/131746580 文章目录 Gradle和AritifactoryGradle基本介绍Gradle插件开发流程本地仓库artifactory搭建添加仓库使用本地仓库gradle插件仓库引入 插件buildSrc开发步骤xxxPluginPg…

五、DQL-2.基本查询

一、数据准备 1、删除表employee: drop table employee; 2、创建表emp: 3、添加数据: 4、查看表数据: 【代码】 -- 查询数据--------------------------------------------------------- drop table emp;-- 数据准备-----------…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 ,正则表达式 包括子目录 ls 不包括 子目录 如果省略路径,表示 在当前路径下,搜索 软链接…

LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统

LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统 航电集成系统是现代战争飞机的重要组成部分,包括惯性导航系统、飞行控制系统、机电管理系统和任务计算机等子系统。战机的作战性能与航电系统息息相关,可以说,没有高性能的空电系统&#x…

【Python爬虫开发基础⑭】Scrapy架构(组件介绍、架构组成和工作原理)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡往期推荐: ⭐️前面比较重要的基础内容: 【Python爬…

数据库用户管理

数据库用户管理 一、创建: 1.新建用户: CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];‘用户名’:指定将创建的用户名. ‘来源地址’:指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机…

Docker 应用容器引擎

Docker 应用容器引擎 一、Docker是什么二、Docker安装和查看1、docker安装2、docker版本信息查看3、docker信息查看 三、镜像操作四、容器操作1、容器创建2、创建并启动容器3、容器的进入4、复制5、容器的导入和导出6、删除容器 一、Docker是什么 是一个开源的应用容器引擎&…

ROS:nodelet

目录 一、前言二、概念三、作用四、使用演示4.1案例简介4.2nodelet 基本使用语法4.3内置案例调用 五、nodelet实现5.1需求5.2流程5.3准备5.4创建插件类并注册插件5.5构建插件库5.6使插件可用于ROS工具链5.6.1配置xml5.6.2导出插件 5.7执行 一、前言 ROS通信是基于Node(节点)的…

【动手学深度学习】--15.含并行连结的网络GoogLeNet

文章目录 含并行连结的网络GoogLeNet1.Inception块2.GoogLeNet模型3.训练模型 含并行连结的网络GoogLeNet 学习视频:含并行连结的网络 GoogLeNet / Inception V3【动手学深度学习v2】 官方笔记:含并行连结的网络(GoogLeNet) 1.…

Appium-Python-Client 源码剖析 (一) driver 的元素查找方法

目录 前言 源码版本:0.9 结构图: mobileby.py appium 的 webdriver.py selenium 的 webdriver.py seleniumdriver appiumdriver 前言 Appium-Python-Client是一个用于Python语言的Appium客户端库,它提供了丰富的API和功能,用于编写和…

【LeetCode】594. 最长和谐子序列

594. 最长和谐子序列(简单) 方法:哈希表计数 思路 题目规定的「和谐子序列」中的最值差值正好为 1,因而子序列排序后必然符合[a,a,.., a 1,a1]形式,即符合条件的和谐子序列长度为相邻两数(差值为 1)的出现次数之和。…