快速列表(quicklist)

redis3 .2版本之前,List类型数据使用的底层数据结构是压缩列表(ziplist)或双向链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比较小时使用压缩列表;当列表元素个数比较多或者某个元素占用空间比较大的时使用双向链表

redis3 .2版本开始,List类型数据使用的底层数据结构是快速列表

快速列表是以压缩列表为节点的双向链表,将双向链表按段切分,每一段使用压缩列表进行内存的连续存储,多个压缩列表通过prev和next指针组成的双向链

快速列表实质就是 压缩列表+双向链表 的组合,结合了压缩列表和双向链表各自的优点

1 quicklist结构

struct quicklist{
quicklistNode *head;
quicklistNode *tail;
unsigned long count;
unsigned long len;
int fill: 16;
unsigned int compress: 16;
}

其中:

head:头部节点

tail:尾部节点

count:所有节点中元素的总数

len:节点的个数

fill:ziplist节点的最大大小,值默认8kb,大小超出后会新建一个ziplist,对应list-max-ziplist-size参数,占16bit

当数字为负数:

  -1:每个ziplist节点大小不能超过4kb(建议)

  -2:每个ziplist节点大小不能超过8kb(默认配置)

  -3:每个ziplist节点大小不能超过16kb(一般不建议)

  -4:每个ziplist节点大小不能超过32kb(不建议)

  -5:每个ziplist节点大小不能超过64kb(正常工作量不建议)

当数字为正数:ziplist节点最多包含的元素个数,最大值为215215

compress:节点压缩深度,表示节点是否使用LZF算法压缩,对应list-compress-depth参数,占16bit

  数字含义如下:

  0:不压缩(默认)

  1:quicklist列表的两端各有1个ziplist节点不压缩,中间的节点压缩

  2:quicklist列表的两端各有2个ziplist节点不压缩,中间的节点压缩

  3:quicklist列表的两端各有3个ziplist节点不压缩,中间的节点压缩

  以此类推,最大为 216216

2 quicklistNode结构

typedef struct quicklistNode {
struct quicklistNode *prev;
struct quicklistNode *next;
unsigned char *zl;
unsigned int sz;
unsigned int count : 16;
unsigned int encoding : 2;
unsigned int container : 2;
unsigned int recompress : 1;
unsigned int attempted_compress : 1;
unsigned int extra : 10;
} quicklistNode;

其中:

prev:前一个节点

nex:后一个节点

zl:数据指针,如果当前节点的数据被压缩,指向quicklistLZF结构;否则指向ziplist结构

sz:当前节点存放数据的大小

count:当前节点存放的元素个数,占16bit

encoding:数据是否被压缩:1表示没有压缩;2表示被压缩了而且使用的是LZF压缩算法,占2bit

container:预留字段,表示quicklistNode直接保存数据还是采用ziplist结构或者其他结构来保存数据,2表示使用ziplist结构,默认;1表示使用其他结构,占2bit

recompress:当前节点数据是否被解压过(压缩过的数据是否被查看过,查看时需要解压):1表示被解压过,等待被再次压缩,占1bit

attempted_compress:测试时使用,占1bit

extra:额外扩展位,占10bit

3 ziplist结构

ziplist结构请参考:redis底层数据结构之压缩列表(ziplist)

4 quicklistLZF结构

typedef struct quicklistLZF {
unsigned int sz;
char compressed[];
} quicklistLZF;

其中:

sz:压缩后的数据大小

compressed:字节数组,压缩后的数据

5 quicklist示意图

存有4个节点,6个元素:两端各有1个节点不压缩,每个节点存有2个元素,

中间2个节点压缩,每个节点存有1个元素

redis底层数据结构之快速列表(quicklist)的更多相关文章

  1. Redis数据结构之快速列表-quicklist

    链表 在Redis的早期版本中,存储list列表结构时,如果元素少则使用压缩列表ziplist,否则使用双向链表linkedlist // 链表节点 struct listNode<T> ...

  2. Redis 底层数据结构之压缩列表

    文章参考:<Redis 设计与实现>黄建宏 压缩列表 压缩列表 ziplist 是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比 ...

  3. Redis源码剖析和注释(七)--- 快速列表(quicklist)

    Redis 快速列表(quicklist)1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现. 通过列表键查看一下:redis 列表键命令详解 127.0. ...

  4. Redis底层数据结构详解

    上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...

  5. Redis学习笔记(二)redis 底层数据结构

    在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.Has ...

  6. Redis 底层数据结构介绍

    Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simp ...

  7. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

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

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

  9. redis 底层数据结构 压缩列表 ziplist

    压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...

  10. 2020-06-13:Redis底层数据结构?

    福哥答案2020-06-13: 福哥口诀法:简链字跳整 压快压 SDS simple synamic string:简单动态字符串.支持自动动态扩容的字节数组 .list :链表 .双端链表.dict ...

随机推荐

  1. vulnhub靶场之VULNCMS: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:VulnCMS: 1,下载地址:https://download.vulnhub.com/vulncms/VulnCMS.ova,下载后直接vb ...

  2. 从0开始学Java 第一期 开发前的准备

    Java 学习(一) - 开发前的准备 前言 由于一些项目上的需要,我得学习一下 Java 这门语言(主要是想写Android),本人并非0基础,至少在上个学期学习了一门必修的程序设计(C语言),所以 ...

  3. angular---嵌套路由

  4. 玩转web3第一篇——web3-react

    概况 web3-react是由Noah Zinsmeister开发的一个web3框架,主要功能是实时获取DApp里的关键数据(如用户当前连接的地址.网络.余额等). Noah也是著名的去中心化交易所u ...

  5. 新版Bing 搜索后台的.NET 技术栈

    微软在今天在Redmond 线下举办媒体一场活动,发布了新版的微软必应,在桌面上推出了测试版,移动版也即将推出.微软首席执行官纳德拉称Al-powered搜索为公司自云15年以来最大的事情. 2023 ...

  6. spring-security 解决

    引入依赖 <dependency> <groupId>org.springframework.security</groupId> <artifactId&g ...

  7. Vue34 VueX

    1 简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. vue官方搭配,专属使用 ...

  8. 自抗扰(ADRC)控制原理及控制器设计

    https://blog.csdn.net/weixin_43487974/article/details/127163824?spm=1001.2101.3001.6650.2&utm_me ...

  9. 样本熵(SampEn)的C/C++代码实现与优化

    正文 本文不介绍什么是样本熵,具体推荐看此文https://blog.csdn.net/Cratial/article/details/79742363,写的很好,里面的示例也被我拿来测试代码写的对不 ...

  10. vue的异步组件

    异步组件 异步组件:可以在首页加载之前先加载的组件,主要是做性能优化,提高用户体验 一.基本用法 在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件.Vue 提供了 de ...