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.hqwc.cn/news/22363.html

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

相关文章

03关于golang中各种运算符的讲解代码和注释

运算符 算术运算符:关系运算符:逻辑运算符:赋值运算符:位运算符: 在Golang中,运算符是用于执行各种数学和逻辑操作的符号。本文将对Golang中常见的运算符进行讲解,并提供一些示例代码和注释。 …

设计模式之单例

文章目录 前言一、单例模式的基本定义二、懒汉式单例三、饿汉式单例四、懒汉式单例存在的线程安全问题总结 前言 单例模式是比较经典的设计模式,本篇我们将结合实际案例说明单例模式的实现原理,以及存在的问题。 一、单例模式的基本定义 单例模式&…

STM32定义变量到指定内存位置

rt thread, 怎么定义变量到指定内存位置? OpenCat是由未来可编程机器人宠物制造商Petoi开发的基于Arduino和Raspberry Pi的开源四足机器人宠物框架。 非 gcc 版 定义一个宏 #ifndef __MEMORY_AT #if (defined (__CC_ARM)) #define _…

Vue--》打造个性化医疗服务的医院预约系统(一)

今天开始使用 vue3 ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运…

Win11 设置FTP服务详细教程

起因: 因测试需要,本机建立FTP服务测试使用,此文章用于记录使用! 操作步骤: 1、配置FTP功能 ①、"winR" > 在运行窗口输入"control" 回车; ②、打开"控制面板" > 点击…

【专题速递】传输网络优化(长专题)

// RTC如何助力远程医疗?5G的差异化体现在哪?SMT如何将远程做到极致?7月29日LiveVideoStackCon2023上海站传输网络优化专场,为您解答。 传输网络优化 为应对互联网日益增长的加速需求、复杂的网络环境以及多种多样的视频业务&am…

Linux常见命令

这里写目录标题 Linux 背景知识Linux环境搭建方式使用终端软件连接到 LinuxLinux 常用命令特殊的目录:绝对路径 与 相对路径vim Linux 背景知识 Linux 是一个操作系统. 和 Windows 是 “并列” 的关系. 安卓系统本质上就是 Linux. 一个完整的操作系统 操作系统内核 配套的…

ylb-接口7注册发送短信

总览: 在common模块下引入短信验证码的依赖项(生成4位随机数): 在web模块下的resources/application.yml,添加配置信息(京东万象): #短信配置 jdwx:sms:url: https://way.jd.com…

ORB-SLAM2学习笔记2之TUM开源数据运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 evo工具1.1 简介1.2 常用命令1.3 安装 2 TUM数据3 单目ORB-SLAM23.1 运行ORB-SLAM23.2 evo评估轨迹3.2.1 载入和对比轨迹3.2.2 计算绝对位姿误差 4 RGB-D ORB-SLAM24.1 运行ORB-SLAM24.2 evo评估轨迹4.2.1 载入和对比轨迹4.2.2 计算绝对轨迹误差 ORB-SLAM2学习…

2003-Can‘t connect to Mysql server on ‘xxx‘ (10060 “Unknown error“)

Navicat连接 阿里云 服务器MySQL5.7数据库报错 解决办法: 进入数据库执行以下sql 1.允许root用户远程连接 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 数据库密码 WITH GRANT OPTION; 2.刷新权限 FLUSH PRIVILEGES;3.执行quit退出数据库 quit; 4.…

uniapp连接到微信小程序

第一次使用uniapp连接到微信小程序,但是出现了define is not defined问题,让人头疼,出现这个问题的原因是 调试基础库 版本过高导致的! 解决办法: 点击设置,选择项目设置。,会进入到如下界面&a…

mac M1 安装nacos

背景 m1不支持本地安装,只能用docker : “由于 rocksdb 暂不支持 M1 平台,所以使用 Zulu JDK 的小伙伴们运行 Nacos 2.x 版本会报错,网上通用的解决方案是使用 Oracle JDK 来运行 Nacos 2.x 版本,但对于强迫症的我来说…