热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis系列(八)底层数据结构之紧凑列表

前言定义总结参考文章联系我前言Redis已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解

  • 前言
  • 定义
  • 总结
  • 参考文章
  • 联系我

前言

Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?

我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。

本文将介绍 Redis 中底层的 listpack(紧凑列表) 的实现方法。 它是 Redis 的 Stream 用到的数据结构之一。


定义

Redis 设计 listpack 的目的就是取代 ziplist, 在 Redis 系列(三)底层数据结构之压缩列表 中我们提到,ziplist 在极小的概率下有可能发生级联更新,当连续规模较大的级联更新发生时,对 Redis 的性能有比较大的影响。

虽然我们都知道这是极小的概率,但是这种设计缺陷却不能被 Redis 的大佬作者所接受,因此在 5.0 版本中新引入了一个数据结构,名叫 listpack, 大家都将它翻译为 紧凑列表.

它的定义和 ziplist 极其相似,只是通过一些新的设计,来解决 ziplist 中的痛点问题。因此本文的讲解基于读者已经了解 ziplist.

ziplist的定义如下:
注意:这是 ziplist 的定义

struct ziplist<T>{// 整个压缩列表占用字节数int32 zlbytes;// 最后一个节点到压缩列表起始位置的偏移量&#xff0c;可以用来快速的定位到压缩列表中的最后一个元素int32 zltail_offset;// 压缩列表包含的元素个数int16 zllength;// 元素内容列表&#xff0c;用数组存储&#xff0c;内存上紧挨着T[] entries;// 压缩列表的结束标志位&#xff0c;值永远为 0xFF.int8 zlend;
}

listpack 的定义和上方基本一致&#xff0c;只是去掉了 zltail_offset 属性。

让我们回想一下&#xff0c;ziplist 中用这个属性做什么&#xff1f;用来方便的找到最后一个节点&#xff0c;然后方便进行反向的遍历。新的 listpack 当然是解决了这个问题&#xff0c;才能放心的删除掉这个属性。

listpack节点的定义如下&#xff1a;

int<var> encoding;
optional byte[] content;
int<var> length;

相比于 ziplist 的定义&#xff0c;它有两点改动&#xff1a;


  1. 记录的长度不再是前一个节点的长度&#xff0c;而是自己的长度。
  2. 将记录自己的长度放到了节点的尾部。

这样做的好处是&#xff1a;


  1. 不再需要 zltail_offset 属性也可以快速定位到最后一个节点。用listpac 的总长度-最后一个节点的长度.
  2. 每个节点记录自己的长度&#xff0c;当本节点的值发生了改变&#xff0c;只需要更改自己的长度即可。不再需要更改别的节点的属性&#xff0c;也就彻底的解决掉了级联更新问题。

总结

listpack 是 Redis 设计用来取代掉 ziplist 的数据结构&#xff0c;它通过每个节点记录自己的长度&#xff0c;且放在节点的尾部&#xff0c;来彻底解决掉了 ziplist 存在的级联更新的问题。

listpack 在 5.0 版本引入&#xff0c;但是由于 ziplist 在 Reids 内部的使用太过于广泛&#xff0c;有一些兼容问题&#xff0c;我们可以预见这将是一个逐步的替换过程。

同样在 5.0 版本引入的 Stream 数据结构中&#xff0c;就使用了 listpack 而不是 ziplist.


参考文章

《Redis 的设计与实现&#xff08;第二版&#xff09;》

《Redis 深度历险&#xff1a;核心原理和应用实践》

完。


联系我

最后&#xff0c;欢迎关注我的个人公众号【 呼延十 】&#xff0c;会不定期更新很多后端工程师的学习笔记。
也欢迎直接公众号私信或者邮箱联系我&#xff0c;一定知无不言&#xff0c;言无不尽。



以上皆为个人所思所得&#xff0c;如有错误欢迎评论区指正。

欢迎转载&#xff0c;烦请署名并保留原文链接。

联系邮箱&#xff1a;huyanshi2580&#64;gmail.com

更多学习笔记见个人博客或关注微信公众号 <呼延十 >------>呼延十


推荐阅读
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 目前我有两张 BMP 图像文件 a.bmp 和 b.bmp,希望将它们按照以下方式进行融合:首先提取 a.bmp 的所有奇数行像素(如第 1、3、5 行),接着获取 b.bmp 的所有偶数行像素(如第 2、4、6 行)。最终目标是将这些行像素交替排列,生成一张新的图像。此过程需要确保像素顺序正确,并保持图像的整体结构和质量。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 在深入探讨进程间通信技术时,本文重点解析了描述符传递的方法。通过详细分析发送和接收描述符的过程,文章首先介绍了发送描述符的具体步骤,并提供了相关函数原型。此外,还讨论了如何高效地在不同进程之间传输文件描述符,以实现资源的共享和同步。这一技术在多进程应用中具有重要意义,能够显著提升系统的性能和可靠性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
author-avatar
心痛则痛1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有