5分钟了解Redis的内部实现快速列表(quicklist)

在Redis3 .2版本之前,存储列表(list)数据结构使用的是压缩列表(ziplist)和链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比较小的时候,使用压缩列表。当列表元素个数比较多或者某个元素占用空间比较大的时候,使用链表。

考虑到链表的附加空间相对太高,结点的内存也是单独分配的,影响内存管理效率。在Redis3 .2版本开始对列表数据结构进行了改造,使用快速列表(quicklist)代替了压缩列表(ziplist)和链表(linkedlist)。

快速列表(quicklist)是以压缩列表(ziplist)为节点的链表(linkedlist),将链表按段切分,每一段使用压缩列表进行内存的连续存储,多个压缩列表通过prev和next指针组成的双向链表。它结合了压缩列表和链表的优势,进一步压缩了内存的使用量,进一步提高了效率。

下面我们了解一下快速列表的具体实现。

在Redis中的快速列表是由 quicklist结构表示的, quicklist结构包含由多个快速列表结点组成的双向链表,每一个快速列表结点都保存了一个压缩列表。下面我们一个一个地详细了解一下。

快速列表是由 quicklist结构表示的,它包含以下几个属性:

  • head属性: 指向头部快速列表结点的指针。
  • tail属性:指向尾部快速列表结点的指针。
  • count属性:在所有压缩列表中元素的个数总和。
  • len属性:快速列表结点的个数。
  • fill属性:压缩列表的最大大小,存放 list-max-ziplist-size参数的值。当超出了这个配置,就会新建一个压缩列表。
  • compress属性:结点压缩深度,存放 list-compress-depth参数的值。
  • bookmarks属性:用来快速列表重新分配内存空间时使用的数组,不使用时不占用空间。
  • bookmark_count属性:bookmarks数组的大小。

快速列表结点使用 quicklistNode结构表示,它包含以下几个属性:

  • prev属性:指向前一个快速列表结点的指针。
  • next属性:指向后一个快速列表结点的指针。
  • zl属性:指向压缩列表的指针,如果当前结点的数据被压缩,那么它指向一个 quicklistLZF结构。
  • sz属性:压缩列表的所占字节总数。
  • count属性:压缩列表中的元素数量。
  • encoding属性:存储形式,原生字节数组还是LZF压缩存储。
  • recompress属性:当查看了某一项被压缩的数据时,需要把数据暂时解压,这时就设置 recompress = 1 做一个标记,等有机会再把数据重新压缩。

当快速列表结点数据被压缩时,数据会被存放在quicklistLZF结构中,它包含以下几个属性:

  • sz属性:表示压缩后的大小。
  • compressed属性:存放压缩后的字节数组。

在快速列表中,两端结点的数据被访问的可能性比较高,中间结点的数据被访问的可能性比较低。如果我们的应用场景符合这个特点,可以把中间结点的数据使用 LZF 算法进行压缩,从而进一步节省内存空间。我们可以对 list-compress-depth参数进行配置。

默认情况下, list-compress-depth参数为0,也就是不压缩数据;当该参数被设置为1时,除了头部和尾部之外的结点都会被压缩;当该参数被设置为2时,除了头部、头部的下一个、尾部、尾部的上一个之外的结点都会被压缩;当该参数被设置为2时,除了头部、头部的下一个、头部的下一个的下一个、尾部、尾部的上一个、尾部的上一个的上一个之外的结点都会被压缩;以此类推。

最后,谢谢你这么帅,还给我 点赞关注

Original: https://www.cnblogs.com/heihaozi/p/16038682.html
Author: 万猫学社
Title: 5分钟了解Redis的内部实现快速列表(quicklist)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580950/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 索引有什么分类?

    索引有什么分类? – 1、主键索引:名为primary的唯一非空索引,不允许有空值。 – 2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和…

    Java 2023年6月5日
    085
  • 关于Java注释报错的一个问题

    做作业时发现一个问题,注释会报错主要代码如下: String str = "C:\\users\\Default.migrated"; str += &quot…

    Java 2023年6月6日
    082
  • Java 开发必装的 IntelliJ IDEA 插件

    http://www.oschina.net/news/69858/java-developer-need-intellij-idea-plugin Original: https…

    Java 2023年6月6日
    094
  • Kafdrop

    Kafdrop 是一个用于查看 Kafka 主题和浏览消费者组的 Web UI docker run -d –rm -p 9000:9000 \ -e KAFKA_BROKERC…

    Java 2023年6月7日
    089
  • Vulnhub-DC-5靶机实战

    前言 靶机下载地址:https://www.vulnhub.com/entry/dc-5,314/ KALI地址:192.168.16.109靶机地址:192.168.16.1 一…

    Java 2023年6月13日
    091
  • 判断是实数的正则表达式

    没啥好说的,想找个能判断字符串是实数的正则表达式网上找了好久,都有各种问题,终于被我试出来一个正确的了,记录一下 ^(-?\d+)(.\d+|\d+)?$ 什么?你问我什么是实数?…

    Java 2023年6月9日
    084
  • 垃圾收集器与内存分配策略

    程序计数器、虚拟机栈、本地方法栈三个区域随着线程的创建而创建、执行完成销毁,栈中的栈帧随着放大的进入和退出执行入栈与出栈,每个栈帧分配多少内存基本上是在类结构确定下来时已知,因此这…

    Java 2023年6月9日
    086
  • 踩坑了!0作为除数,不一定会抛出异常!

    你好呀,我是歪歪。 踩坑了啊,又踩坑了啊! 这次踩到一个特别无语的常识坑。知道真相的那一刻,人就是整个麻掉。 先上个代码: private static&…

    Java 2023年6月5日
    096
  • 云图说丨DDoS防护解决方案:DDoS大流量攻击防得住

    摘要:华为云安全服务打造DDoS防护解决方案,助您防患于未然,筑牢业务安全防线。 本文分享自华为云社区《【云图说】第255期 DDoS防护解决方案:DDoS大流量攻击防得住》,作者…

    Java 2023年6月15日
    074
  • 纪念第一次创建博客

    在2021年10月1日,在这个重要的日子里,我在博客园对我的博客进行了第一次改动,修改了博客的背景图片和博客的模板。 Original: https://www.cnblogs.c…

    Java 2023年6月9日
    075
  • 常用Linux命令之文件相关命令(一)

    一、文件显示命令 1、cat命令: cat命令连接文件并打印到标准输出设备上,经常用来显示文件的内容,相当于DOS下的type命令 cat命令的一般格式: cat [选项] 文件名…

    Java 2023年6月8日
    0137
  • 分布式文件系统FastDFS简介、搭建、与SpringBoot整合实现图片上传

    之前大学时搭建过一个FastDFS的图片服务器,当时只是抱着好奇的态度搭着玩一下,当时搭建采用了一台虚拟机,tracker和storage服务在一台机器上放着,最近翻之前的博客突然…

    Java 2023年6月13日
    078
  • Java获取本机IP

    import lombok.extern.slf4j.Slf4j; import org.junit.Test; import java.net.Inet4Address; imp…

    Java 2023年5月29日
    090
  • Mybatis学习笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    0120
  • 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句

    3.表属性实体类: 4.表结构实体类: 5.启动类: package ccc.contorller; import ccc.enty.ColumnSchema; import cc…

    Java 2023年6月9日
    063
  • ThoughtWorks一面

    1.在github上clone了一个java的仓库 https://github.com/techops-recsys-grad-hiring/joi-grad-shopping-…

    Java 2023年6月5日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球