一、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底层数据结构相关推荐

  1. 四、redis原理之set底层数据结构

    一.redis原理之set底层数据结构? 其底层有两种实现方式: 1.当value是整数值时,且数据量不大时使用inset来存储, 2.其他情况都是用字典dict来存储 inset的结构: typed ...

  2. 一、redis原理之string底层数据结构SDS

    一.前言 我们说Redis 是用 C 语言写的,,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符'\0'结尾的字符数组),它是自定义的数据结构SDS(simple dynamic ...

  3. 【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构

    [重难点][Redis 01]为什么使用 Redis.Redis 的线程模型.Redis 的数据类型及其底层数据结构 文章目录 [重难点][Redis 01]为什么使用 Redis.Redis 的线程 ...

  4. Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?

    欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 老周写这篇文章的初衷是这样的,之前项目中有大量使用 R ...

  5. mysql原理(1) mysql底层数据结构

    一.前言 1.1 索引结构及查找算法 一个sql语句在mysql里究竟是如何运行的呢?又是怎么去查找的呢? 其中就涉及到数据库(存储数据)以及查找算法. 先来看一下几种查找算法: 目录查找:类似索引 ...

  6. Redis原理一之内部数据结构

    Redis 内部数据结构 前言 简单动态字符串 双向链表 字典 哈希表实现 跳跃表 单链表 添加索引 redis的跳跃表 小结 整数集合 intset 结构 小结 压缩列表zipList 数组 压缩列 ...

  7. 深入理解硬盘原理,Mysql索引底层数据结构与算法的来龙去脉(多图)

    前言: 如何触发尽量少的磁盘io 找到数据? 数据库中的索引是什么? 硬盘原理 现在大部分存储设备依然是硬盘 信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大, ...

  8. Redis底层数据结构介绍

    文章目录 前言 1. 哈希表 2. 简单动态字符串 使用SDS的好处 对比C字符串 3. 压缩列表 4. 跳表 5. 整数集合.双向链表 Redis数据类型与底层数据结构对照表 前言 一谈到Redis ...

  9. 一文带你深入理解Redis中的底层数据结构,再也不怕不懂数据类型的底层了

    数据结构前言 都说Redis快,因为什么呢?只是因为它是内存数据库,所有操作都是基于内存进行的吗?其实不然,这与它的数据结构也是密不可分的.下面我们就来了解一下Redis的数据结构. Redis 数据 ...

最新文章

  1. 安装flex4 plug-in插件的时候遇到老是在起始处安装不起
  2. Mycat连接数据库之后导致表名全小写的问题分析研究
  3. java-mybaits-00101-基础安装配制
  4. org.apache.log4j.Logger详解
  5. 分布式并行计算MapReduce
  6. Vue2.x中vuex的使用方法及应用时的项目文件结构设计以完整demo实例解释
  7. Node.js Stream - 实战篇
  8. 中富之命能有多少钱_邯郸白铁风管工每天工资多少钱?白铁风管价格多少钱你能接受?...
  9. Docker安装实践Jenkins
  10. L1-027. 出租-PAT团体程序设计天梯赛GPLT
  11. 使用JavaScript实现纯前端读取excel文件并与后台进行交互
  12. 关于电脑程序无响应的常见原因以及解决办法
  13. Pt100 铂电阻的三线测温线路
  14. vbScript实现开机后的开心网自动登陆
  15. C#简单实现摄影测量后方交会
  16. 但行好事 莫问前程(九月)
  17. python显示等待隐式等待
  18. vscode默认输出到调试控制台
  19. 小米手机系统脚本上传服务器文件夹,小米手机与电脑可以高速传文件?看看这些你也许会明白-红米手机怎么连接电脑...
  20. SuperMap iClient3D for WebGL教程 粒子特效-扩展喷泉特效

热门文章

  1. 设计模式 —— 发布订阅模式
  2. OSChina 周日乱弹 —— 康熙看了伤心,乾隆听了流泪
  3. Python接口自动化函数调用TypeError: seperate_data() missing 1 required positional argument:‘self’
  4. 尚硅谷谷粒商城项目学习笔记-基础-P1项目搭建
  5. 进入开发阶段,你准备好了吗?
  6. Oracle列转行语句
  7. java图形界面设计——求三角形的面积
  8. java1.8中javassist获取接口函数参数名称
  9. twisted网络框架
  10. 面试官:spring boot和spring究竟有啥区别?