当前位置: 首页 > news >正文

Redis数据结构:ZipList与Listpack

ZipList

ZipList 是一种特殊的 “双端链表”,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入 / 弹出操作,并且该操作的时间复杂度为 O (1)。

其结构包含:

  • zlb‌ytes:总字节数。
  • zltail:尾偏移量。
  • zllenentry节点个数。
  • 多个entry:表示链表中的节点,有head节点和tail节点等。
  • zlend:结束标示,值为0xff

ZipList 为节省内存,Entry 不采用普通链表记录前后节点指针的方式,而是由 previous_entry_length前一节点长度,根据前一节点长度大小占 1 或 5 字节)、encoding编码属性,记录 content 数据类型和长度,占 1、2 或 5 字节)、content(保存节点数据,可为字符串或整数)三部分组成。

应用场景

数据量较小时,Redis 会优先使用 ZipList 存储 hash、list、zset 等数据,以此节省内存空间。

缺点

当向 ZipList 插入元素时,如果空间不足就需要重新分配连续内存空间。并且由于 ZipList 每个元素会记录前一个元素的长度(prevlen),新元素插入可能导致前一个元素的 prevlen 占用字节数发生变化,进而造成后续元素的 prevlen 字段都要依次调整,引发连锁更新,严重影响访问性能。

因此,Redis推出了Listpack来改正ZipList的缺点。

Listpack

Listpack 是 Redis 5.0 引入的新结构,目前主要应用于 Stream 数据结构中,从 Redis 6.2 版本开始,quicklist 的底层实现也由 ZipList 改为了 Listpack。

Listpack 是 Redis 为优化内存与性能推出的紧凑数据结构,用于替代部分场景下的 ZipList。

它的整体结构是连续的内存块,包含:

  • lpbytes:记录 Listpack 占用的总字节数。
  • lplen:表示 Listpack 中元素的个数。
  • 多个 entry:是 Listpack 存储数据的基本单元,有头节点、尾节点等。
  • lpending(可选,部分场景存在):用于记录一些待处理的信息,比如可能涉及的增量更新相关标识等。
  • lpend:结束标识,标志 Listpack 的结尾。

Listpack 里的 Entry 为提升效率,不再因前一元素长度变化引发连锁更新。每个 Entry 由以下部分组成:

  • encoding:编码属性,记录 data 的数据类型(如字符串、整数等)以及长度,占用 1、2 或 5 字节。
  • data:负责保存节点的实际数据,可存储字符串或整数等。
  • length:当前 Entry 自身的长度,采用变长编码,能根据实际长度灵活占用 1 至 5 字节,且每个 Entry 仅记录自身长度,元素操作时互不影响,避免了 ZipList 可能出现的连锁更新问题,让内存分配和更新更稳定高效。

优势

Listpack 最大的优势是解决了 ZipList 的连锁更新问题因为每个列表项仅记录自身长度,在新增或修改元素时,不会影响后续列表项的长度,每个元素操作相互独立,使得内存分配与更新的性能更加稳定。


文章转载自:

http://rBKpC3RS.ykkrg.cn
http://mnoqGP6N.ykkrg.cn
http://aSZg5YSY.ykkrg.cn
http://rJKibcEb.ykkrg.cn
http://XP5iFpYN.ykkrg.cn
http://mI7bTM78.ykkrg.cn
http://6OPEVFiB.ykkrg.cn
http://E7J9pOML.ykkrg.cn
http://AcfPEy2g.ykkrg.cn
http://Aq3PYQns.ykkrg.cn
http://6aKOFrqQ.ykkrg.cn
http://qqHhguYt.ykkrg.cn
http://IXahlChT.ykkrg.cn
http://1QrETPxM.ykkrg.cn
http://1RlKZp3o.ykkrg.cn
http://n9Juxqz2.ykkrg.cn
http://Yk3jRAyL.ykkrg.cn
http://icodgewL.ykkrg.cn
http://8Of8tTom.ykkrg.cn
http://kGmLmVx4.ykkrg.cn
http://CDgdYooO.ykkrg.cn
http://h3kDHzQn.ykkrg.cn
http://7trryrS5.ykkrg.cn
http://RBBhC7gN.ykkrg.cn
http://zukWWsSz.ykkrg.cn
http://wZuKDofA.ykkrg.cn
http://VpvSobYi.ykkrg.cn
http://S1AE22oL.ykkrg.cn
http://NvYx4RgV.ykkrg.cn
http://txnxdW7c.ykkrg.cn
http://www.dtcms.com/a/385175.html

相关文章:

  • 数据库选型指南:从需求分析到技术决策的全方位解析
  • Linex操作系统-Shell脚本(四)
  • 浏览器为啥要对 JavaScript 定时器“踩刹车”?
  • Linux网络:socket编程TCP
  • 基于python大数据的游戏数据分析系统的设计与实现
  • 巧用ebpf排查linux网络问题
  • Android音频学习(十八)——混音流程
  • Android 开发布局问题:android:layout_weight 属性不生效
  • Android WorkManager的概念和使用
  • PyTorch实战——基于LSTM的情感分析模型
  • 深入浅出 MySQL 的 MVCC:多版本并发控制的工作机制与应用
  • 【完整源码+数据集+部署教程】衬衫组件图像分割系统: yolov8-seg-C2f-EMBC
  • 知识图谱——语义搜索概念解析
  • [系统架构设计师]知识点(二十五)
  • 9.15 ES6-变量-常量-块级作用域-解构赋值-箭头函数
  • 第一章:走进 ES6
  • 9.15 ES6-展开运算符-新增数组字符串方法-字面量对象简写
  • 架构师成长之路-架构方法论
  • 【CTF-WEB】表单提交(特殊参数:?url=%80和?url=@)(通过GBK编码绕过实现文件包含读取flag)
  • Java快速入门基础1
  • 嵌入式跟踪宏单元ETM(Embedded Trace Macrocell)
  • [免费]基于Python的Django商品二手交易平台【论文+源码+SQL脚本】
  • 「Memene 摸鱼日报 2025.9.15」Gemini 应用在美国 iOS 下载量超越 ChatGPT,西湖大学推出 AI 审稿系统
  • 并发和并行区别
  • RabbitMQ 内存管理与性能优化
  • VSCode关闭C或C++项目启动时的自动cmake功能
  • Git 查看状态(git status)、查看提交记录(git log)和提交日志(git reflog)
  • 第五届长城杯(京津冀蒙版)WEB
  • N1 junior 2025 safenotes
  • 2025年09月15日Github流行趋势