快速列表(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. P7076 [CSP-S2020] 动物园

    题面 动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照<饲养指南>购买不同种类的饲料,并将购买清单发给采购员小 B. 具体而言,动物世界里存在 \(2^k\) 种不同的动物 ...

  2. ZXing CaptureActivity黑屏问题

    关于zxing captureActivity黑屏的问题,我在网上搜索一下,结果发现几乎没有这方面的资料.后来自己用了半天时间,独步跟踪调试,查看相机类的代码,最后发现了一点问题,就是关闭相机的时候没 ...

  3. 创建a标签使用get请求下载文件

    创建a标签使用get请求下载文件 let url = `${BaseUrl.path}/aa/bb/cc?no=${this.sqcode}&pae=${this.wlName}&as ...

  4. Python开发的常用组件

    1. 生成6位数字随机验证码 import random import string def num_code(length=6): """ 生成长度为length的数字 ...

  5. Unity_UIWidgets - 组件Drawer

    Unity_UIWidgets - 组件Drawer 组件Drawer Drawer 构造 代码 效果 Drawer使用完毕 结语 图标Icon QQ 今日无推荐 组件Drawer 各位伙伴,周日愉快 ...

  6. c++ stl 详解 csp备考

    最近在准备csp认证考试,打算使用c++语言,以下是关于c++ stl库的内容: algorithm概览(作者:当格子衫爱上Helloworld) stl库详解(作者:c语言中文网) https:// ...

  7. SpringCloud 消费请求Eureka调用服务提供者报错

    SpringCloud 消费请求Eureka调用服务提供者报错 springCloud 2022.0.1 springboot 3.0.2 消费程序 通过eureka集群查询服务,根据eureka中注 ...

  8. python字典生成式,列表生成式

    list1 = [1,2,3,4,5] list2 = ['a','b','c','d','e'] {k: v for k, v in zip(list1, list2)} # {1:'a',2:'b ...

  9. 微信小程序-支付

    微信小程序的支付只要用到官方的支付API : wx.requestPayment(Object object) 官方文档地址:https://developers.weixin.qq.com/mini ...

  10. scrapy的pipline的不同操作

    针对json文件 import json import os class SpyOppoPipeline: def __init__(self): self.file = open('曹姐.json' ...