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

redis 从0到1完整学习 (八):QuickList 数据结构

文章目录

  • 1. 引言
  • 2. redis 源码下载
  • 3. quickList 数据结构
    • 3.1 整体
    • 3.2 数据结构
  • 4. 参考


1. 引言

前情提要:
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》

本文主要结合源码来介绍 QuickList 的数据结构

2. redis 源码下载

Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
在这里插入图片描述

3. quickList 数据结构

3.1 整体

quickList 是 Redis 中用于实现 list 数据结构的一种特殊数据结构,它在Redis 3.2版本之后被引入。quickList 结合了 zipList 和 linkedList 的特性,将多个 zipList 通过双向链表连接起来,从而实现了高效的内存压缩和快速的读写操作。相比于传统的 linkedList,quickList 在内存使用上更加紧凑,可以存储更多的元素,同时由于 ziplist 的特性,读写操作的时间复杂度为O(1),效率更高。

quickList 的数据结构示意图如下:
在这里插入图片描述
(1)限制 zipList entry 数量:
quickList 限制 zipList 中 entry 过多,redis 提供了一个配置项:list-max-ziplist-size 来限制。
如果值为正,则代表 zipList 允许的 entry 个数的最大值;
如果值为负,则代表 zipList 的最大内存大小,分5种情况:

  • -1:每个 zipList 的内存占用不能超过4kb
  • -2:每个 zipList 的内存占用不能超过8kb,默认值
  • -3:每个 zipList 的内存占用不能超过16kb
  • -4:每个 zipList 的内存占用不能超过32kb
  • -5:每个 zipList 的内存占用不能超过64kb

(2)对 zipList 节点压缩:
通过配置项:list-compress-depth。

  • 0:不压缩
  • n:quickList 首尾各有n个节点不压缩,中间节点压缩

3.2 数据结构

数据结构如下:
在这里插入图片描述
在这里插入图片描述
数据结构示意图如下:
在这里插入图片描述

4. 参考

《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》

相关文章:

  • Android画布Canvas drawPath绘制跟随手指移动的圆,Kotlin
  • Springcloud Alibaba 使用Canal将MySql数据实时同步到Elasticsearch
  • Git三种方法从远程仓库拉取指定分支
  • Leetcode 2971. Find Polygon With the Largest Perimeter
  • C#实现串口通讯
  • Unity Shader 实现X光效果
  • 【Qt-Event-信号和槽】
  • go 语言程序设计第2章--程序结构
  • JS-图片预览
  • 图论 | 网络流的基本概念
  • elasticsearch系列四:集群常规运维
  • WEB 3D技术 three.js 色彩空间讲解
  • Vuex介绍2
  • 基于openGauss5.0.0全密态数据库等值查询小案例
  • Easy Excel 学习
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Magento 1.x 中文订单打印乱码
  • node入门
  • PAT A1050
  • PHP面试之三:MySQL数据库
  • Promise初体验
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 设计模式 开闭原则
  • 使用Gradle第一次构建Java程序
  • 以太坊客户端Geth命令参数详解
  • 应用生命周期终极 DevOps 工具包
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​Linux·i2c驱动架构​
  • # 数论-逆元
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • ###项目技术发展史
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)Dubbo快速入门、介绍、使用
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • @Bean有哪些属性
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [20150629]简单的加密连接.txt
  • [2018-01-08] Python强化周的第一天
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [bzoj 3534][Sdoi2014] 重建
  • [C#]扩展方法
  • [CSS]中子元素在父元素中居中
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [Flutter]打包IPA
  • [FZSZOJ 1223] 上海红茶馆
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [LeetCode]—Implement strStr() 寻找子串匹配第一个位置 (KMP)
  • [LeetCode]—Simplify Path 简化路径表达式