Redis从入门到精通【高阶篇】之底层数据结构链表包(listpacks)详解

news2024/11/17 5:45:10

文章目录

  • 0.前言
  • 2. listpacks(紧凑列表)
  • 2. 源码解析
  • 3. 总结

在这里插入图片描述

0.前言

上个篇章回顾,我们上个章节我们学习了《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》

本文将Redis底层数据结构 listpacks(链表包)详解,它用于实现列表数据类型。listpacks是一种紧凑的连续内存块,其设计目标是减少内存的占用,通过紧凑的内存布局和多种数据类型的编码方式,提供了高效的插入和删除操作。

listpacks的结构如下:

|------------------|
| zlbytes          | 4字节,列表总字节数
| zltail           | 4字节,列表尾节点偏移量
| zllen            | 2字节,列表节点数量
| entry1           | 列表节点1
| entry2           | 列表节点2
|      ...         |
| entryN           | 列表节点N
|------------------|

每个列表节点(entry)都包含以下信息:

|------------------|
| prevlen          | 变长字段,前一个节点的长度
| encoding         | 1字节,数据编码方式
| content          | 变长字段,节点数据
|------------------|

listpacks中的节点数据可以是字符串、整数或浮点数。根据节点数据的类型不同,编码方式也不同,包括整数编码、字符串编码和浮点数编码。

listpacks的优点在于:

  1. 紧凑的内存布局,减少了内存碎片和空间占用;
  2. 插入和删除操作的性能较好,特别是在列表的两端进行操作时;
  3. 支持多种数据类型的编码方式,提供了灵活性。

需要注意的是,listpacks适用于较小的列表,当列表较大时,其性能可能会下降。在这种情况下,可以使用另一种底层数据结构ziplist(压缩列表)来代替listpacks。ziplist使用类似的原理,但在处理大型列表时具有更好的性能表现。

2. listpacks(紧凑列表)

listpacks是一种紧凑的、高效的数据结构,用于解决列表操作中的内存浪费问题。

在listpacks中,每个节点中可以包含多个元素,每个元素由长度和数据两部分组成。通过使用可变长度的数据和长度字段,listpacks可以在保证高效的操作性能的同时,减少内存的浪费,提高内存利用率。

listpacks在Redis中被广泛应用于实现列表等数据结构。通过使用listpacks,Redis可以在保证高效的操作性能的同时,减少内存的浪费,提高内存利用率。
listpacks是一种紧凑的、高效的数据结构,主要用于解决列表操作中的内存浪费问题。在Redis中,listpacks被用来实现列表等功能。

在传统的双向链表中,每个节点都需要存储指向前驱节点和后继节点的指针,这会导致内存浪费。而在listpacks中,多个节点的数据被紧密地存储在一个连续的内存块中,不需要存储指针,从而减少了内存的浪费。

listpacks的具体实现方法为:将每个节点的数据按照一定的格式编码,并依次存储在一个连续的内存块中,每个节点的数据之间使用特定的标记分隔。在查找节点时,可以通过偏移量定位到节点的位置,并通过解码获取节点的数据。
image.png
在Redis中,listpacks被用来实现列表等数据结构。通过使用listpacks,Redis可以在保证高效的操作性能的同时,减少内存的浪费,提高内存利用率。

2. 源码解析

ListPacks的源码实现位于Redis的src/listpack.c文件中。下面我将简要解析ListPacks的源码实现。
在这里插入图片描述
上面截图中listpacks模块相关的函数声明。我大概进行个说明

  • lpNew:创建一个新的listpack,返回一个指向新listpack的指针。
  • lpFree:释放listpack的内存空间。
  • lpInsert:在指定位置插入一个元素,参数包括插入的位置、元素的内容和大小。插入成功,函数返回listpack的新起始位置。
  • lpAppend:在listpack的末尾追加一个元素,参数包括元素的内容和大小。如果追加成功,函数返回listpack的新起始位置。
  • lpDelete:删除指定位置的元素,参数包括要删除的位置。如果删除成功,函数返回listpack的新起始位置。
  • lpLength:返回listpack中元素的数量。
  • lpGet:获取指定位置的元素及其整数值,参数包括要获取的位置和一个缓冲区用于存储整数值。返回指向元素内容的指针。
  • lpFirst:返回listpack中的第一个元素。
  • lpLast:返回listpack中的最后一个元素。
  • lpNext:返回指定位置的下一个元素。
  • lpPrev:返回指定位置的前一个元素。
  • lpBytes:返回listpack占用的字节数。
  • lpSeek:返回指定索引位置的元素。

但是上面的函数的定义,具体实现是在Redis源码的src/listpack.c文件中和我们之前讲过的IntSet类似。在listpack.c文件中,你可以找到每个函数的具体实现代码。你可以通过扫一遍代码来深入了解这些函数的具体实现细节,以及listpack数据结构的底层实现原理。

3. 总结

listpacks是Redis中重要的底层数据结构,它们为Redis提供了高效的数据存储和操作能力。基 listpacks可以用来实现列表等数据结构。在实际的Redis应用中,了解和理解这些底层数据结构的实现原理,对于提高Redis的性能和使用效果是非常有帮助的。

如果要详细学习我推荐csdn一位博主Redis的消息队列Stream

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

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

相关文章

SynchronousQueue的基本介绍

SynchronousQueue介绍 SynchronousQueue作为阻塞队列,区别于其他的阻塞队列。因为他不存储元素,但是存储消费者或者生产者。要是SynchronousQueue队列中存储了一个生产者,再来一个生产者想存放到队列中,要是你使用的是put方法&…

chatgpt赋能python:Python自动编号教程:如何给数据添加自动编号

Python自动编号教程:如何给数据添加自动编号 在进行数据处理和整理过程中,有时候需要为数据添加自动编号才能更好地进行分析和展示。而使用Python编程语言可以快速而准确地实现自动编号的功能。在本篇教程中,我们将介绍如何使用Python处理数…

网络层:IPv4数据报的首部格式

1.IPv4数据报的首部格式 笔记来源: 湖科大教书匠:IPv4数据报的首部格式 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 下图来源:以太网MAC帧格式 IP数据报属于MAC帧的数据部分 IPv4数据报的首部格式 1.1 IP数…

VS2019编译GSL

VS2019 编译GSL 下载GSL:https://github.com/BrianGladman/gsl,此仓库带有用于编译的VS解决方案。 解压后,在 build.vc 目录下有两个解决方案: gsl.dll.sln 用于编译生成动态库gsl.lib.sln 用于编译生成静态库 请先阅读 build…

haproxy服务器对nginx服务器web服务调度负载均衡、用nfs做共享目录(脚本部署)

目录 一、准备 二、在作为haproxy的服务器上导入以下shell执行haproxy安装 三、由于nginx服务需要用的nfs共享目录,先部署nfs 四、nginx服务器1部署 五、nginx服务器2部署同上 六、测试 一、准备 四台服务器 系统IP搭建服务器centos7192.168.1.12haproxycent…

深度学习经典trick汇总

深度学习经典trick汇总 trick这个词或许有投机取巧的意味,但深度学习论文中出现的很多这个trick确实对模型更方面性能有所提高,而且它们中的很多还具有普适性,那么这种“trick“或许应该被叫做“技术”。 1. 权重衰减 θ t 1 ( 1 − ω α…

DHCP服务器

文章目录 DHCP服务器DHCP的工作原理DHCP服务器的用途DHCP协议的工作方式DHCP服务器给予客户端固定或动态的IP参数关于租约所造成的问题与租约期限多台DHCP服务器在同一物理网段的情况 何时需要架设DHCP服务器使用DHCP的时机不建议使用DHCP主机的时机 DHCP服务器端的配置所需软件…

Quantum Utility!IBM开辟“量子计算的实用时代”

光子盒研究院 今天,IBM(纽约证券交易所股票代码:IBM)宣布了一项新的突破,并发表在科学杂志《自然》的封面上。 ——团队首次证明了量子计算机可以在100多个量子比特的规模上产生精确的结果;并且至少在一种计…

Redis入门 - 基础通用指令

原文首更地址,阅读效果更佳! Redis入门 - 基础通用指令 | CoderMast编程桅杆https://www.codermast.com/database/redis/base-commind.html 在正式介绍Redis数据结构及其操作指令之前,我们需要先掌握一些最基础的通用指令。 这些都是Redis…

鸟类识别Python,基于TensorFlow卷积神经网络【实战项目】

一、介绍 鸟类识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,…

chatgpt赋能python:Python自动获取图片数据的方法

Python自动获取图片数据的方法 随着信息时代的到来,图像数据已经越来越重要。我们如何从互联网上获取大量的图片数据呢?Python提供了简单而直接的方法。本文将介绍如何使用Python自动获取图片数据,充分利用Python的编程能力,开展…

异常的相关知识

📢博客主页:盾山狂热粉的博客_CSDN博客-C、C语言,机器视觉领域博主📢努力努力再努力嗷~~~✨ 💡大纲 ⭕总结了python中所有可能的异常情况,有异常不一定是坏事,有提醒作用 一、常见异常 💡可以…

Midjourney命令列表Command List介绍

您可以通过键入命令与Discord上的Midjourney Bot进行交互。命令可以用来生成图像、更改默认设置、监看用户信息以及执行其他有用的任务。 Midjourney 命令可以在任何Bot Channel中使用,在允许 Midjourney Bot 运行的私有 Discord 服务器上使用,或者在与…

Java项目开发基本数据类型与封装数据类型的选择

问题 Java项目开发基本数据类型与封装数据类型的选择 详细问题 关于基本数据类型与封装数据类型的区别,作为面试经典题目已被熟知,但是,项目开发时,对于一个变量,是选择基本数据类型,还是封装数据类型&a…

【SpringBoot】SpringBoot案例 | Web后端开发

黑马2023JavaWeb的B站视频,还可以,学的大部分都是有用的东西。没有一上来还JDBC。 新建项目、更改application.properties配置: spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:…

定时任务执行时间设置详解

目录 前提实践举例定时任务执行时间设置详解定时器包含的子表达式和对应子表达式允许的值子表达式中特殊字符含义的解释和相应示例 前提 一般在处理业务过程中,都需要在特定的时间点执行特定的任务,尤其是业务复杂且执行时间很长,业务之间关…

java中的时间

一、JDK7的类 (1)Date 时间 (2)SimpleDateFormat 格式化时间 (3)Calendar 日历 格林尼治时间(Greenwich Mean Time),简称GMT。 目前的世界标准时间(UTC)以替换…

C++的友元函数、友元类、内部类

目录 1.友元函数 1.定义 2.注意 2.友元类 1.定义 3.内部类(Java喜欢用,C不怎么用) 1.定义 特性: 1.友元函数 1.定义 1.友元函数可访问类的私有和保护成员,但不是类的成员函数。 2.友元函数不能const修饰 3.…

Rust语言从入门到入坑——(4)Rust语法(上)

文章目录 0 引入1、基础语法1.1、变量1.2、常量1.3、重影 2、数据类型2.1、整形2.2、浮点型2.3、其他2.注释与打印2.1 注释2.2、打印 3、总结 0 引入 在这里我们需要介绍Rust语法,一共分三部分,第一部分是基础语言,和C语言类比,如…

从零构建后端项目-创建SpringBoot项目配置MyBatis

目录 主体介绍 创建SpringBoot项目主要步骤 配置MyBatis 整合高级功能 创建SpringBoot项目 配置Tomcat 配置MySQL数据源 配置Redis数据源 配置MongoDB数据源 运行项目,检测配置 配置MyBatis 创建IDEA数据库连接 生成MyBatis各种文件 配置MyBatis 配…