6、Redis系统-数据结构-07-QuickList

七、快速列表(QuickList)

快速列表(QuickList)是 Redis 中用于实现列表(List)类型的一种高效数据结构。它结合了双向链表和压缩列表的优点,既支持高效的顺序访问,又能有效节省内存。

1. 结构设计

快速列表的基本思想是将多个压缩列表(ziplist)节点连接成一个双向链表。每个快速列表节点包含一个压缩列表,快速列表节点通过双向链表连接在一起。这样,快速列表既能利用压缩列表的内存紧凑性,又能利用链表的高效插入和删除操作。

typedef struct quicklist {quicklistNode *head;      // 快速列表头节点quicklistNode *tail;      // 快速列表尾节点unsigned long count;      // 快速列表中的元素总数量unsigned long len;        // 快速列表中的节点数量int fill : QL_FILL_BITS;  // 节点的填充因子unsigned int compress : QL_COMP_BITS;  // 压缩深度quicklistBookmark bookmarks[];  // 书签,用于快速定位
} quicklist;
快速列表的结构
  1. 快速列表(quicklist):快速列表结构包含指向头节点和尾节点的指针、元素总数量、节点数量、节点填充因子和压缩深度等。
  2. 快速列表节点(quicklistNode):每个节点包含前后指针、压缩列表指针、压缩列表大小、节点中元素数量等。
typedef struct quicklistNode {struct quicklistNode *prev;   // 前一个节点struct quicklistNode *next;   // 后一个节点unsigned char *zl;            // 压缩列表指针unsigned int sz;              // 压缩列表大小unsigned int count : 16;      // 节点中元素数量unsigned int encoding : 2;    // 编码类型unsigned int container : 2;   // 容器类型unsigned int recompress : 1;  // 重新压缩标志unsigned int attempted_compress : 1;  // 尝试压缩标志unsigned int extra : 10;      // 额外空间
} quicklistNode;
节点的设计
  • prev 和 next:分别指向前一个节点和后一个节点,实现双向链表结构。
  • zl:指向实际存储数据的压缩列表。
  • sz:压缩列表的大小。
  • count:节点中包含的元素数量。
2. 快速列表的优点
  1. 内存紧凑:快速列表通过使用压缩列表来存储数据,减少了内存碎片,提高了内存利用率。
  2. 高效操作:快速列表支持在列表两端进行高效的插入和删除操作,适用于需要频繁操作的场景。
  3. 灵活性:通过双向链表结构,快速列表可以在需要时扩展或压缩,适应不同大小的数据集。
3. 操作原理
插入操作

插入新元素时,首先找到合适的节点(通常是头节点或尾节点),然后将新元素插入到节点的压缩列表中。如果当前节点已满,则创建一个新的节点,并将元素插入到新节点中。这样可以保证插入操作的高效性。

  • 在头部插入:新元素插入到头节点的压缩列表中,如果头节点满了,则创建一个新的头节点。
  • 在尾部插入:新元素插入到尾节点的压缩列表中,如果尾节点满了,则创建一个新的尾节点。
删除操作

删除元素时,首先找到包含该元素的节点,然后在压缩列表中删除元素。如果节点变为空节点,则将节点从快速列表中移除。这样可以保证删除操作的高效性。

  • 删除头部元素:从头节点的压缩列表中删除元素,如果头节点空了,则移除头节点。
  • 删除尾部元素:从尾节点的压缩列表中删除元素,如果尾节点空了,则移除尾节点。
查找操作

查找元素时,通过遍历快速列表节点,查找包含目标元素的压缩列表,然后在压缩列表中查找目标元素。这样可以保证查找操作的高效性。

  • 顺序查找:从头节点开始,依次遍历每个节点的压缩列表,直到找到目标元素。
  • 逆序查找:从尾节点开始,依次遍历每个节点的压缩列表,直到找到目标元素。
4. 快速列表的优化策略
压缩和填充因子

快速列表的填充因子用于控制每个压缩列表节点的大小。合理设置填充因子可以平衡内存利用率和操作性能。填充因子越大,每个节点包含的元素越多,内存利用率越高,但插入和删除操作的性能可能会下降;填充因子越小,每个节点包含的元素越少,插入和删除操作的性能越高,但内存利用率可能会下降。

压缩深度

快速列表的压缩深度用于控制数据压缩的程度。合理设置压缩深度可以进一步节省内存。压缩深度越大,压缩列表节点之间的数据压缩程度越高,内存利用率越高,但解压缩操作的开销可能会增加;压缩深度越小,压缩列表节点之间的数据压缩程度越低,解压缩操作的开销较小,但内存利用率可能会下降。

5. 使用示例

以下是一些使用 Redis 快速列表的示例,展示了如何利用快速列表进行数据的存储和操作。

插入数据

LPUSH mylist "hello"
LPUSH mylist "world"
RPUSH mylist "foo"
RPUSH mylist "bar"

获取数据

LRANGE mylist 0 -1
# 1) "world"
# 2) "hello"
# 3) "foo"
# 4) "bar"

删除数据

LPOP mylist
# "world"RPOP mylist
# "bar"LRANGE mylist 0 -1
# 1) "hello"
# 2) "foo"
结论

通过上述解析,我们可以更好地理解快速列表的设计思想和实现原理,从而在实际开发中更好地利用快速列表提供的优势。在 Redis 中,快速列表通过结合双向链表和压缩列表的优点,实现了高效的存储和操作,适用于需要频繁插入、删除和查找的场景。了解快速列表的内部实现,可以帮助我们在实际应用中更好地利用 Redis 的性能和功能。

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

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

相关文章

数据结构第13节 无向图

无向图是图论中的一个基本概念,它是数学和计算机科学中用来描述一组对象(顶点)以及它们之间的成对关系(边)的结构。在无向图中,边是没有方向的,这意味着边所连接的两个顶点可以互相访问。 定义…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative ,卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片,默认拖动的时候就会导致像上图一样变成了选中图片移动,从而没法触发拖动事件。消…

苹果电脑能玩赛博朋克2077吗 如何在mac上运行赛博朋克2077 crossover能玩什么游戏

各位喜欢赛博朋克风的一定不能错过《赛博朋克2077》。那么《赛博朋克2077》是一款什么样的游戏?《赛博朋克2077》在苹果电脑上可以运行吗?一起来看看介绍吧。 一、《赛博朋克2077》是一款什么样的游戏? 《赛博朋克2077》是一款由CD Projekt …

MIT6.s081 2021 Lab Traps

使用gdb调试xv6内核 从最近两个 Lab 开始,代码逻辑的复杂度明显上升,对内核进行调试可能是帮助理解操作系统机制的绝佳方法。因此在开始本 Lab 之前,我们先来配置一下针对 xv6 内核的 gdb 调试器。 安装 gdb-multiarch. 利用包管理工具进行…

基于Maximin的异常检测方法(MATLAB)

异常存在于各个应用领域之中,往往比正常所携带的信息更多也更为重要。例如医疗系统中疾病模式,信用卡消费中的欺诈行为,数据库中数据泄露,大型机器故障,网络入侵行为等。大数据技术体系的快速兴起与发展,加…

【React Native优质开源项目】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

字符串——string类的常用接口

一、string类对象的常见构造 二、string类对象的容量操作 三、string类对象的访问及遍历操作 四、string类对象的修改操作 一、string类对象的常见构造 1.string() ——构造空的string类对象,也就是空字符串 2.string(const char* s) ——用字符串来初始化stri…

如何成为一个优秀的软件产品开发经理

成为一名优秀的软件产品开发经理,需要综合技术、管理、市场和人际交往等多方面的能力。以下是成为优秀软件产品开发经理的关键步骤和技能: 1. 技术背景与理解 技术知识:虽然不需要成为某一领域的顶级专家,但对软件开发流程、常用…

【Linux】压缩命令——gzip,bzip2,xz

1.压缩文件的用途与技术 你是否有过文件太大,导致无法以正常的E-mail方式发送?又或学校、厂商要求使用CD或DVD来做数据归档之用,但是你的单一文件却都比这些传统的一次性存储媒介还要大,那怎么分成多块来刻录?还有&am…

【QT】显示类控件

显示类控件 显示类控件1. label - 标签2. LCD Number - 显示数字的控件3. ProgressBar - 进度条4. Calendar Widget - 日历5. Line Edit - 输入框6. Text Edit - 多行输入框7. Combo Box - 下拉框8. Spin Box - 微调框9. Date Edit & Time Edit - 日期微调框10. Dial - 旋钮…

Windows 11中的WSL(Windows Subsystem for Linux)详细介绍与安装过程

文章目录 Windows 11中的WSL(Windows Subsystem for Linux)详细介绍与安装过程一、WSL简介二、WSL安装过程三、WSL常见应用场景四、常见问题和解决方案五、结论 Windows 11中的WSL(Windows Subsystem for Linux)详细介绍与安装过程…

Hive 高可用分布式部署详细步骤

目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中,将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…

昇思25天学习打卡营第3天|MindSpore张量

# 打卡 目录 # 打卡 类 涉及知识点 1. 创建张量的4种方式 运行例子 2. 张量属性和索引 运行例子 3. 张量运算 运行例子 4. Tensor 与 Numpy 转换 5. 稀疏张量:CSR和COO CSRTensor 运行例子 COOTensor 运行例子 RowTensor 类 import mindspore from…

Linux系统的介绍和常用命令

文章目录 介绍常用命令文件和目录操作文件内容操作系统管理命令网络命令 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:Liunx系统 ✨文章内容:Liunx系统介绍 &…

2024年【危险化学品生产单位安全生产管理人员】考试总结及危险化学品生产单位安全生产管理人员考试试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考试总结是安全生产模拟考试一点通总题库中生成的一套危险化学品生产单位安全生产管理人员考试试题,安全生产模拟考试一点通上危险化学品生产单位安全生产管理人员作业…

【MySQL】3.表的操作

表的操作 一.创建表二.查看表三.修改表四.删除表 一.创建表 create table [if not exists] tb_name( field1 datatype comment 说明, field2 datatype, field3 datatype) charsetutf8 collateutf8_gerenal_ci engineInnoDB//表的编码集,校验集如果不指定&#xff…

【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!

视频演示 【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!! 1,安装docker方法: #!/bin/shdistribution$(…

Linux上将图片转换为PDF

在Linux系统中,将图片转换为PDF文件的常见方法是使用ImageMagick这个工具。 1、下载ImageMagick: 首先需要安装ImageMagick,可以通过包管理器安装,例如在Ubuntu上使用: sudo apt update sudo apt install imagemagic…

路径跟踪算法之PID、PP、Stanley详细理解

一、前言 今天又来补作业了! 在跟踪控制领域,PID(Proportional-Integral-Derivative, 分别为比例、积分、微分)、PP( Pure-Puresuit, 纯跟踪)、Stanley(前轮反馈控制)是三种最为常见…

Rust 组织管理

Rust 组织管理 Rust 是一种系统编程语言,以其内存安全性、速度和并发性而闻名。它由 Mozilla 开发,并得到了一个庞大而活跃的社区的支持。Rust 的组织管理涉及多个方面,包括项目管理、社区参与、工具和库的维护,以及生态系统的整…