17- Redis 中的 quicklist 数据结构

news2024/10/6 22:29:39

在 Redis 3.0 之前,List 对象的底层数据结构是双向链表或者压缩列表,然后在 Redis 3.2 的时候,List 对象的底层改由 quicklist 数据结构实现。

其实 quicklist 就是【双向链表 + 压缩列表】组合,因为一个 quicklist 就是一个链表,而链表中的每个元素又是一个压缩列表。

在前面讲压缩列表的时候,提到过压缩列表的不足,虽然压缩列表是通过紧凑型的内存布局节省了内存开销,但是因为它的结构设计,如果保存的元素数量增加,或者元素变大了,压缩列表会有【连锁更新】的风险,一旦发生,会造成性能下降。

quicklist 解决办法,通过控制每个链表节点中的压缩列表的大小或者元素个数,来规避连锁更新的问题,因为压缩列表元素越少或越小,连锁更新带来的影响就越小,从而提供了更好的访问性能。

1. quicklist 结构设计

quicklist 的结构体跟链表的结构体类似,都包含了表头和表尾,区别在于 quicklist 的节点是 quicklistNode。

typedef struct quicklist {
    // quicklist 的链表头
    quicklistNode *head;
    // quicklist 的链表尾
    quicklistNode *tail;
    // 所有压缩列表中的总元素个数
    unsigned long count;
    // quicklistNode 的个数
    unsigned long len;
    ...
} quicklist;

接下来,是quicklistNode 的结构定义:

typedef struct quicklistNode {
    // 前一个 quicklistNode
    struct quicklistNode *prev;
    // 下一个 quicklistNode
    struct quicklistNode *next;
    // quicklistNode 指向的压缩列表
    unsigned char *zl;
    // 压缩列表的字节大小
    unsigned int sz;
    // 压缩列表的元素个数
    unsigned int count : 16;
    ...
} quicklistNode;

可以看到,quicklistNode 结构体里包含了前一个节点和下一个节点指针,这样每个 quicklistNode 形成了一个 双向链表,但是链表节点的元素不再是单纯保存元素值,而是保存了一个压缩列表,所以 quicklistNode 结构体里有个指向压缩列表的指针 *zl。

如下:

在向 quicklist 添加一个元素的时候,不会像普通的链表那样,直接新建一个链表节点,而是会检查插入位置的压缩列表是否能容纳该元素,如果能容纳就直接保存到 quicklistNode 结构里的压缩列表,如果不能容纳,才会新建一个新的 quicklistNode 结构。

quicklist 会控制 quicklistNode 结构里的压缩列表的大小或者元素个数,来规避潜在的连锁更新的风险,但是这并没有完全解决连锁更新的问题。

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

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

相关文章

解锁 DevOps 精通:成功的综合指南

在动态的软件开发领域,要掌握 DevOps,需要对其核心原则有细致的了解,并采取战略性实施方法。DevOps 是一种协作方法,它将软件开发 (Dev) 和 IT 运营 (Ops) 结合起来,以自动化和简化软件交付流程。它旨在缩短开发周期、…

双模蓝牙芯片TD5165A功能介绍—拓达半导体

拓达芯片TD5165A是一颗支持U盘&TF卡的双模蓝牙芯片,此颗芯片的亮点在于同时支持音频蓝牙与BLE数传,芯片在支持蓝牙无损音乐播放的同时,还支持 APP和小程序,通过BLE通道对芯片进行控制,同时也支持通过蓝牙串口透传数…

抖动的评估(TJ 和 TIE 的关系)

TIE:时间间隔误差(Time Interval Error,简称TIE)抖动,即在很长的一串波形中,每次边缘的位置相对理想clk 的抖动。 TJBER :TJ(Total Jitter)总体抖动,为某误码率(Bit Error Ratio&am…

网络流常用示意图及基本概念

【网络流简介】 ● 网络流基本概念网络:网络是一个有向有权图,包含一个源点和一个汇点,没有反平行边。网络流:是定义在网络边集上的一个非负函数,表示边上的流量。网络最大流:在满足容量约束和流量守恒的前…

..\USER\stm32f10x.h(298): error: #67: expected a “}“

原keil4的示例工程在用keil5打开之后出现报错: ..\USER\stm32f10x.h(298): error: #67: expected a "}" 在去掉手动添加的一个宏定义STM32F10X_HD后即可正常编译,因为KEIL5已经自动添加了

VR 大厦巡检机器人:开启智能化巡检新时代

在现代城市的高楼大厦中,保障建筑物的安全和功能正常运作是至关重要的。随着建筑结构日益复杂,隐蔽角落和繁杂管道线路的存在使得传统人工巡检面临诸多挑战和局限。电路老化、狭窄通道、拐角等潜在安全隐患,往往难以通过人工巡检完全覆盖&…

【STM32HAL库学习】定时器功能、时钟以及各种模式理解

一、文章目的 记录自己从学习了定时器理论->代码实现使用定时->查询数据手册,加深了对定时器的理解以及该过程遇到了的一些不清楚的知识。 上图为参考手册里通用定时器框图,关于定时器各种情况的工作都在上面了,在理论学习和实际应用后…

spring常用注解(八)@Async

一、介绍 1、介绍 二、原理 三、集成与使用 1、集成方法 &#xff08;1&#xff09;开启 使用以下注解开启 EnableAsync &#xff08;2&#xff09;使用 在需要异步处理的方法上加上 Async 2、返回值 Async注解的方法返回值只能为void或者Future<T>。 &…

轻松实现App推广代理结算,Xinstall超级渠道功能助您一臂之力!

在App推广的广阔天地中&#xff0c;与渠道方建立合作关系&#xff0c;共同实现用户增长和品牌提升&#xff0c;已成为众多开发者和广告主的共识。然而&#xff0c;如何高效管理这些渠道、监测推广效果、实现代理结算&#xff0c;一直是困扰大家的难题。今天&#xff0c;我们就来…

比较器 XD393 XINLUDA(信路达) DIP-8 2.5mA 模拟比较器 双路差动

XD393是一款比较器集成电路&#xff0c;适用于各种电子设备中的信号比较和处理。它的应用领域可能包括但不限于以下几个方面&#xff1a; 1. 电源管理&#xff1a;在电源管理系统中&#xff0c;XD393可以用来监控电压水平&#xff0c;确保系统稳定运行&#xff0c;或者触发某…

振动分析-2-信号频域分析以及频率分辨率的理解

参考2023-11-26 什么是频率&#xff1f; 参考2016-10-31什么是固有频率&#xff1f; 参考2024-01-28什么是频率分辨率&#xff1f; 参考2024-01-07香农采样定理有两种描述&#xff0c;哪个正确&#xff1f; 1 什么是频率 1.1 频率的定义 我们把振动发生完成一个完整往复循环…

利用 AI 深度学习,实现化合物配比最优化解决方案

为什么需要化合物配比的优化&#xff1f; 在化合物制造行业中&#xff0c;化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前&#xff0c;这一过程高度依赖于材料专家和工程技术人员的经验&#xff0c;通过反复试验来验证产品性能&#xff0c;确保其满足市场和客户的…

Redis实现分布式锁有哪些方案?

Redis实现分布式锁有哪些方案&#xff1f; 在这里分享六种Redis分布式锁的正确使用方式&#xff0c;由易到难。 本文已收录到Java面试网站 方案一&#xff1a;SETNXEXPIRE 方案二&#xff1a;SETNXvalue值(系统时间过期时间) 方案三&#xff1a;使用Lua脚本(包含SETNXEXPIRE…

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第332p-第p335的内容 熔断降级 开启对Feign远程服务的熔断保护机制 feign.sentinel.enabletrue 这里我们只是调用方加就行 被调用方不用加 正常…

【Ai】使用LabelStudio做数据标注

一、什么是LabelStudio LabelStudio是一个功能丰富、灵活便捷、易于使用的数据标注工具&#xff0c;适用于各种机器学习和深度学习项目中的数据标注工作。有特点如下&#xff1a; 多功能性&#xff1a;LabelStudio支持为多种数据类型创建自定义标注界面&#xff0c;包括图像、…

【会议征稿,五大海内外高校支持】第四届经济发展与商业文化国际学术会议(ICEDBC2024,6月21-23)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在中国大连隆重召开。会议主要围绕“经济发展”“商业文化”等研究领域展开讨论。 旨在为经济&#xff0c;商业的专家学者及企业发展人提供一个分享研究成果、讨论存在的问题与挑战…

富瀚微FH8322 ISP图像调试—BLC校正

1、简单介绍 目录 1、简单介绍 2、调试方法 3、输出结果 富瀚微平台调试有一段时间了&#xff0c;一直没有总结&#xff0c;我们调试ISP的时候&#xff0c;首先一步时确定好sensor的黑电平值&#xff0c;黑电平如果不准&#xff0c;则会影响到后面的颜色及对比度相关模块。…

AI预测福彩3D采取888=3策略+和值012路或双胆下一测试6月11日新模型预测第1弹

很抱歉各位小伙伴&#xff0c;端午节三天去了趟外地&#xff0c;没有按时更新3D和排三的预测。前面跟大家说过&#xff0c;8码定位是关键&#xff0c;8码定位能稳定在80%的命中率&#xff0c;才有望通过缩号缩至200-250注以内通过等额方式进行投资。由于前面的模型对8码定位的效…

MONA来了 小鹏子品牌首车定名M03,20万内空间智能颜值都要能打

作者 |苗岭 编辑 |德新 小鹏汽车今日公布&#xff0c;MONA系列的第一款车正式命名为&#xff0c;小鹏M03。 9个月前&#xff0c;小鹏汽车从滴滴手中收购了代号为「达芬奇」的造车项目。 5月21日&#xff0c;何小鹏在小鹏汽车的第一季度财报会议上宣布&#xff0c;MONA系列的…

超详解——Python 编程中的类型和对象深入探讨——基础篇

目录 1. 内建类型的布尔值 1.1 布尔值的基本规则 1.2 进阶应用 2. 对象身份的比较 2.1 基本概念 2.2 示例代码 2.3 实际应用 3. 对象类型比较 3.1 基本概念 3.2 示例代码 3.3 实际应用 4. 类型工厂函数 4.1 常见的类型工厂函数 4.2 示例代码 4.3 实际应用 5. P…