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

news/2025/2/22 19:16:33

文章目录

  • 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.niftyadmin.cn/n/441715.html

相关文章

11-高性能JSON库——fastjson2

目录 1.具体使用 1.1.添加fastjson2依赖 1.2.常用类和方法 1.3.将JSON字符串转换成对象 1.3.1.JSON字符串转换成对象 1.3.2.JSON字符串转换成数组 1.4.将对象转换成JSON字符串 1.4.1.将对象转换成JSON字符串 1.4.2.将数组转换成 JSON 字符串 2.性能测试报告 3.总结 …

抽象出一个信息大厦,并构思如何建造,开始施工

接着上一篇文章,系统已经可以看见大的框架,有了基本的设想模样,但还没有任何用处。从最初始的目的出发,我们开始思考如何去施工建造这个工程。 从面向对象的角度去思考 现在已经拥有一个程序运行流程:平台入口的方法 PrimaryApp类的Start()方法->产生一个闪屏->从…

代码审计——垂直越权详解

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 垂直越权,也称权限提升,是一种“基于URL的访问控制”设计缺陷引起的漏洞。 由于Web应用程序没有做权…

chatgpt赋能python:Python中嵌套列表的访问方法

Python中嵌套列表的访问方法 在Python编程中,嵌套列表是一种很常见的数据类型。它可以存储多个列表,使得数据结构更加复杂灵活。然而,如何访问嵌套列表中的元素呢?本文将详细介绍Python中嵌套列表的访问方法。 嵌套列表的定义 …

【Django 网页Web开发】24. 实战项目:moudleForm的文件上传应用到城市管理(17)(保姆级图文)

目录 用户上传文件存放media如何启用1. 在urls.py中进行配置:2. 在settings.py中进行配置:3. 能够通过media的url访问文件 moudleForm上传文件实现城市管理1. moudle.py2. url.py3. city.py4. city.html5. 文件上传小结6. 城市管理效果总结 欢迎关注 『D…

【Android复习笔记】OkHttp核心原理

使用方法 调用流程 0kHttp请求过程中最少只需要接触OkHttpClient、Request、Call、 Response,但是框架内部进行大量的逻辑处理。 所有的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠分发器来调配请求任务。 分发器:内部维护队列与线程池,完成请求调配;拦截…

2023开放原子全球开源峰会——Intel专题探访

浩瀚宇宙,有光,朝着未来之境;万物之始,有道,启示智慧共荣;在多维赋能的时空里,见微知著,开放共享 ,包罗万象;在抵达终点的路途中,彼此陪伴&#x…

Qt编写视频监控系统79-四种界面导航栏的设计

一、前言 最初视频监控系统按照二级菜单的设计思路,顶部标题栏一级菜单,左侧对应二级菜单,最初采用图片在上面,文字在下面的按钮方式展示,随着功能的增加,二级菜单越来越多,如果都是这个图文上…