三、redis原理之list底层数据结构
一、redis原理之list底层数据结构ziplist和quicklist。
快速列表 quicklist【quicklist = 链表+ziplist】
- 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist ,即压缩列表 . 它将所有的元素紧挨着一起存储,分配的是一块连续的内存
- 当数据量比较多才会改成 quicklist.
本质上来说,quicklist里面保存着一个一个小的ziplist
quickList就是一个标准的双向链表的配置,有head 有tail;
每一个节点是一个quicklistNode,包含prev和next指针。
每一个quicklistNode 包含 一个ziplist,*zp 压缩链表里存储键值。
所以quicklist是对ziplist进行一次封装,使用小块的ziplist来既保证了少使用内存,也保证了性能。
为啥不用普通的链表:因为普通的链表需要的附加指针空间太大,会比较浪费空间,而且会加重内存的碎片化 .
ziplist的结构:
struct ziplist<T> {int32 zlbytes; // 整个压缩列表占用字节数int32 zltail_offset; // 最后一个元素距离压缩列表起始位置的偏移量,用于快速定位到最后一个节点int16 zllength; // 元素个数T[] entries; // 元素内容列表,挨个挨个紧凑存储int8 zlend; // 标志压缩列表的结束,值恒为 0xFF
}
压缩列表ziplist是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。
压缩列表为了支持双向遍历,所以才会有 ztail_offset 这个字段,用来快速定位到最后一 个元素,然后倒着遍历。
entry的结构:
struct entry {int<var> prevlen; // 前一个 entry 的字节长度int<var> encoding; // 元素类型编码optional byte[] content; // 元素内容
}
它的 prevlen 字段表示前一个 entry 的字节长度,当压缩列表倒着遍历时,需要通过这个字段来快速定位到下一个元素的位置。
ziplist 存多少元素?
quicklist 内部默认单个 ziplist 长度为 8k 字节,超出了这个字节数,就会新起一个ziplist。
三、redis原理之list底层数据结构相关推荐
- 四、redis原理之set底层数据结构
一.redis原理之set底层数据结构? 其底层有两种实现方式: 1.当value是整数值时,且数据量不大时使用inset来存储, 2.其他情况都是用字典dict来存储 inset的结构: typed ...
- 一、redis原理之string底层数据结构SDS
一.前言 我们说Redis 是用 C 语言写的,,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符'\0'结尾的字符数组),它是自定义的数据结构SDS(simple dynamic ...
- 【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构
[重难点][Redis 01]为什么使用 Redis.Redis 的线程模型.Redis 的数据类型及其底层数据结构 文章目录 [重难点][Redis 01]为什么使用 Redis.Redis 的线程 ...
- Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 老周写这篇文章的初衷是这样的,之前项目中有大量使用 R ...
- mysql原理(1) mysql底层数据结构
一.前言 1.1 索引结构及查找算法 一个sql语句在mysql里究竟是如何运行的呢?又是怎么去查找的呢? 其中就涉及到数据库(存储数据)以及查找算法. 先来看一下几种查找算法: 目录查找:类似索引 ...
- Redis原理一之内部数据结构
Redis 内部数据结构 前言 简单动态字符串 双向链表 字典 哈希表实现 跳跃表 单链表 添加索引 redis的跳跃表 小结 整数集合 intset 结构 小结 压缩列表zipList 数组 压缩列 ...
- 深入理解硬盘原理,Mysql索引底层数据结构与算法的来龙去脉(多图)
前言: 如何触发尽量少的磁盘io 找到数据? 数据库中的索引是什么? 硬盘原理 现在大部分存储设备依然是硬盘 信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大, ...
- Redis底层数据结构介绍
文章目录 前言 1. 哈希表 2. 简单动态字符串 使用SDS的好处 对比C字符串 3. 压缩列表 4. 跳表 5. 整数集合.双向链表 Redis数据类型与底层数据结构对照表 前言 一谈到Redis ...
- 一文带你深入理解Redis中的底层数据结构,再也不怕不懂数据类型的底层了
数据结构前言 都说Redis快,因为什么呢?只是因为它是内存数据库,所有操作都是基于内存进行的吗?其实不然,这与它的数据结构也是密不可分的.下面我们就来了解一下Redis的数据结构. Redis 数据 ...
最新文章
- 安装flex4 plug-in插件的时候遇到老是在起始处安装不起
- Mycat连接数据库之后导致表名全小写的问题分析研究
- java-mybaits-00101-基础安装配制
- org.apache.log4j.Logger详解
- 分布式并行计算MapReduce
- Vue2.x中vuex的使用方法及应用时的项目文件结构设计以完整demo实例解释
- Node.js Stream - 实战篇
- 中富之命能有多少钱_邯郸白铁风管工每天工资多少钱?白铁风管价格多少钱你能接受?...
- Docker安装实践Jenkins
- L1-027. 出租-PAT团体程序设计天梯赛GPLT
- 使用JavaScript实现纯前端读取excel文件并与后台进行交互
- 关于电脑程序无响应的常见原因以及解决办法
- Pt100 铂电阻的三线测温线路
- vbScript实现开机后的开心网自动登陆
- C#简单实现摄影测量后方交会
- 但行好事 莫问前程(九月)
- python显示等待隐式等待
- vscode默认输出到调试控制台
- 小米手机系统脚本上传服务器文件夹,小米手机与电脑可以高速传文件?看看这些你也许会明白-红米手机怎么连接电脑...
- SuperMap iClient3D for WebGL教程 粒子特效-扩展喷泉特效
热门文章
- 设计模式 —— 发布订阅模式
- OSChina 周日乱弹 —— 康熙看了伤心,乾隆听了流泪
- Python接口自动化函数调用TypeError: seperate_data() missing 1 required positional argument:‘self’
- 尚硅谷谷粒商城项目学习笔记-基础-P1项目搭建
- 进入开发阶段,你准备好了吗?
- Oracle列转行语句
- java图形界面设计——求三角形的面积
- java1.8中javassist获取接口函数参数名称
- twisted网络框架
- 面试官:spring boot和spring究竟有啥区别?