Redis数据结构 — Listpack

news/2024/11/30 5:42:20/

目录

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.ppmy.cn/news/882752.html

相关文章

洛谷P1083 [NOIP2012 提高组] 借教室

题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租借教室的信息,我们…

React、Vue3中父组件如何调用子组件内部的方法

React 当父组件需要调用子组件的方法时,可以通过useImperativeHandle钩子函数实现。以下例子是ts实现方式。 在子组件中使用 useImperativeHandle 钩子,将指定的方法暴露给父组件,以便父组件可以通过子组件的引用来调用该方法。 在子组件中…

开始单反生涯

一直都想学习摄影,今天终于决定入手佳能550D。通过网络搜索,电话了解,最终决定到摄苑网买,毕竟网上购买风险大了点。 由于是新手,决定先买套机(IS18-55镜头),整机¥5450&a…

相机的 高清到底是一个什么东西

高清到底是一个什么东西?可能很多人还只能依稀的知道1080P什么的。当你在广告中看到数字电视机时,总会说支持1080i/1080P这样标准,先不提现在市面上销售的电视机有几个能达到这样一个要求。我们来看看1080i和1080P都代表着什么意思——1080i和…

京东内部 Spring Boot 全解笔记,精髓!

在使用传统的 Spring 去做 Java EE(Java Enterprise Edition)开发中,大量的 XML 文件存在于项目之中,导致 JavaEE 项目变得慢慢笨重起来,,繁琐的配置和整合第三方框架的配置,导致了开发和部署效…

在阿里云linux上安装MySql数据库

我们先远程连接服务器 然后输入 sudo yum update重新运行一下 然后 sudo yum install mysql-server安装 mysql 服务 其中有两次 y n 选择 都选y就好了 然后 运行 sudo service mysqld start启动MySql 然后 我们查看一下MySql sudo service mysqld status

windows无盘启动技术开发之不同网卡使用同一个启动镜像的问题

by fanxiushu 2023-07-13 转载或引用请注明原作者。 这是一个非常烦的问题,也不是实现技术有多难,而是繁琐。 这也更进一步制约了无盘启动技术朝广泛以及更通用的方向发展,只能用在特定场所。 我所知道的,目前用得最多的地方就是网…

国防科大计算机学院卢凯,国防科技大学实行本硕、硕博连读机制

本报讯国防科技大学年仅26岁的卢凯日前顺利通过博士学位论文答辩,成为该校第一位毕业的硕博连读生。整个学习过程仅用4年6个月,比正常读完硕士、博士研究生至少提前了一年半。像卢凯这样进入人才培养“快车道”的优秀人才,该校还有180多名。 …