Redis数据结构之快速列表-quicklist
链表
在Redis
的早期版本中,存储list
列表结构时,如果元素少则使用压缩列表ziplist
,否则使用双向链表linkedlist
// 链表节点
struct listNode<T> {
listNode *prev;
listNode *next;
T value;
} listNode;
// 链表
struct list {
listNode *head; // 表头指针
listNode *tail; // 表尾指针
long len; // 链表长度
} list;
对于链表,有以下特性:
双端:节点带有
prev
和next
指针以获取前置、后置节点无环:表头的
prev
和表尾的tail
指向NULL
带表头表尾指针:获取表头表尾节点复杂度为
O(1)
带链表长度计数器:获取节点数复杂度为
O(1)
多态:使用
void*
来保存节点值,可保存不同类型值
快速列表
使用链表的附加空间相对太高,因为64bit
系统中指针是8
个字节,所以prev
和next
指针需要占据16
个字节,且链表节点在内存中单独分配,会加剧内存的碎片化,影响内存管理效率。
考虑到链表的以上缺点,Redis
后续版本对列表数据结构进行改造,使用quicklist
代替了ziplist
和linkedlist
。
// 快速列表节点
struct quicklistNode {
quicklistNode *prev;
quicklistNode *next;
ziplist *zl; // 指向压缩列表
int32 size; // ziplist字节总数
int16 count; // ziplist中元素数量
int2 encoding; // 存储形式,表示原生字节数组还是LZF压缩存储
...
} quicklistNode;
// 快速列表
struct quicklist {
quicklistNode *head;
quicklistNode *next;
long count; // 元素总数
int nodes; // ziplist节点个数
int compressDepth; // LZF算法压缩深度
}
quicklist;
从代码可以看出,quicklist
实际上是ziplist
和linkedlist
的混合体,它将linkedlist
按段进行切分,每一段使用ziplist
进行紧凑存储,多个ziplist
之间使用双向指针进行串接。
quicklist
内部默认单个ziplist
长度为8k
字节,超出这个字节数就会新起一个ziplist
进行存储。
在quicklist
内部,为进一步节约空间,还会使用LZF
算法对ziplist
进行压缩存储。
默认情况下,quicklist
压缩深度为0
即不压缩,实际压缩深度由配置中的list-compress-depth
决定。
为支持快速pop/push
,quicklist
首尾两个ziplist
不进行压缩,此时压缩深度为1
,深度为2
就表示首尾第一个和第二个ziplist
都不进行压缩。
Redis数据结构之快速列表-quicklist的更多相关文章
- Redis源码剖析和注释(七)--- 快速列表(quicklist)
Redis 快速列表(quicklist)1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现. 通过列表键查看一下:redis 列表键命令详解 127.0. ...
- Redis数据结构之压缩列表-ziplist
为了节约内存,在zset和hash容器对象元素个数较少时,Redis会采用压缩列表(ziplist)进行存储. 压缩列表是一块连续的内存空间,元素之间紧挨着存储,不存在冗余 一个压缩列表可以包含任意多 ...
- Redis数据结构之压缩列表
压缩列表是Redis为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型数据结构.一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值. 一.压缩列表结构1. 压缩列 ...
- 5分钟了解Redis的内部实现快速列表(quicklist)
快速列表简介 在Redis3 .2版本之前,存储列表(list)数据结构使用的是压缩列表(ziplist)和链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比较小的时候,使用压缩 ...
- 面试官:你看过Redis数据结构底层实现吗?
面试中,redis也是很受面试官亲睐的一部分.我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构.你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap. ...
- Redis 数据结构与编码技术 (Object Encoding)
数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string:字符串(可以表示字符串.整数.位图) list:列表(可以表示线性表.栈.双端队列.阻塞队列) hash:哈希表 set:集 ...
- Redis 数据结构的底层实现 (一) RealObject,embstr,sds,ziplist,quicklist
一.realObject Redis使用 string list zset hash set 五大数据类型来存储键和值.在每次生成一个键值对时,都会生成两个对象,一个储存键一个储存值.redis定义了 ...
- Redis数据结构——quicklist
之前的文章我们曾总结到了Redis数据结构--链表和Redis数据结构--压缩列表这两种数据结构,他们是Redis List(列表)对象的底层实现方式.但是考虑到链表的附加空间相对太高,prev 和 ...
- Redis学习系列六ZSet(有序列表)及Redis数据结构的过期
一.简介 ZSet可以说是Redis中最有趣的数据结构了,因为他兼具了Hash集合和Set的双重特性,也是用的最多的,保证了value值的唯一性的同时,,同时又保证了高性能,最主要的是还可以给每个Va ...
随机推荐
- git操作的日常用法
参考博客: https://blog.csdn.net/afei__/article/details/51567155# 最近一段时间总结一些git在个人日常开发当中用到的方法, 并记录下来, 同时 ...
- 开发效率优化之自动化构建系统Gradle(二)下篇
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统 ...
- window下eclipse搭建hadoop环境
1 生成插件jar 1.1 安装java,ant运行环境 1.2 下载hadoop-2.5.0.tar.gz并解压到指定目录 1.3 下载hadoop2x-eclipse-plugin-master. ...
- js中构造函数的原型添加成员的两种方式
首先,js中给原型对象添加属性和方法. 方式一:对象的动态特效 给原型对象添加成员 语法:构造函数.prototype.方法名=function (){ } 方式二:替换原型对象(不是覆盖,而是替换, ...
- javafx将数据库内容输出到tableview表格
一 .创建Fxml文件,用Javafx Scene Builder 编辑页面,创建tableview(表格)和tablecolum(表格中的列),并为其设置fxid: 二.生成fxml文件的控制类: ...
- PHP中unset和null的比较
起因 因为感兴趣于unset($var)和$var=null的区别,于是找了一个stackoverflow高分问题及答案,翻译以供参考. 注:以下的问题和答案翻译自http://stackoverfl ...
- 百度地图errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败
最近要维护以前师兄的一个android项目,里面用到了百度地图,在我的机器上按照官网的方式获取的SHA1签名+包名申请ak: 然而就是报errorcode: 230 uid: -1 appid -1 ...
- Ansible 和 Playbook 暂存
Ansible 和 Playbook 暂存 , 也是一个批量管理工具 自动化的批量管理工具 主机清单 HOST Inventory 模块插件 Playbooks 查看ansible的目录结构 ...
- 安装 sysbench的 报错 /usr/bin/ld: cannot find -lmysqlclient_r 解决办法
首先你需要找到这个库的位置 一般找的话需要将lib 给加上(注意:我这里是 -lmysqlclient_r 的报错,于是我找就找 libmysqlclient_r ) find / -name lib ...
- Codeforces 1159E 拓扑排序
题意及思路:https://www.cnblogs.com/dd-bond/p/10859864.html 代码: #include <bits/stdc++.h> #define LL ...