热门标签 | 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

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


推荐阅读
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
  • CentOS 6.8 上安装 Oracle 10.2.0.1 的常见问题及解决方案
    本文记录了在 CentOS 6.8 系统上安装 Oracle 10.2.0.1 数据库时遇到的问题及解决方法,包括依赖库缺失、操作系统版本不兼容、用户权限不足等问题。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
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社区 版权所有