快速列表(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. 算法之Dijkstra及其堆优化和SPFA:图上单源最短路径神器

    签到题-- 题目传送门 SPFA算法 本人曾经写过一篇有关Bellman-ford的博,但就算是挂了优化的ford也只能过这道题的弱化版. 今天就先填个坑,先讲SPFA. 在这里我直接认为你们已经有一 ...

  2. 构造方法-JavaBean

    构造方法 当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值. 小贴士:无论你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法, 一旦自己定义了 ...

  3. springboot输出json日志

    <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-lo ...

  4. 搭个ChatGPT算法模型,离Java程序员有多远?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 最近 ChatGPT 很火,火到了各行各业.记得去年更多的还是码农最新体验后拿它搜代码,现在各 ...

  5. Vue08 数据代理

    1 说明 所谓"数据代理",是指 通过一个对象代理对另一个对象的属性进行读或写操作. 2 简单示例 2.1 代码 let obj = {x:100}; let obj2 = {y: ...

  6. python导入和导出excel,以文件流形式返回前端

    一.导入excel 1. 安装依赖包 pip install xlrd 2. 读取excel getColIndex(colList:list,colName:str): try: return co ...

  7. Portainer功能使用之容器管理

    下载镜像 点击左边功能菜单栏[images]下载镜像 容器管理 点击左边功能菜单栏[Containers]创建.启动.重启.停止.监控等功能 创建容器 例如:安装nginx代理服务器,并设置容器信息( ...

  8. vue+.net入门级书签项目

    vu3+.net6 webApi 书签管理项目 前言 Gitee项目地址:https://gitee.com/zyplj/book-marks Github项目地址:https://github.co ...

  9. 五大数据类型 - 字符串 - 列表 list - 集合set - 有序集合 - 哈希 hashMap

    基础知识 redis默认有16个数据库:默认使用的是第0个. 可以使用select num切换 查看DB大小 DBSIZE 查看所有的key **keys ** 清空当前数据库 flushdb 清空全 ...

  10. [COCI2015-2016#2] VUDU

    题目传送门 思路 这是一种简单的树状数组解法. 我们设偏移值表示 \(a_i\) 与目标平均数 \(p\) 的差值,显然,一个区间若能满足条件,需要满足此区间的偏移值之和 \(\ge 0\). 看到区 ...