前言

  • 在之前我们已经学习了redis五大数据结构中的list结构。其内部是linkedList和zipList两种结构。这是我们已经学习的内容。之前我没有结合操作具体查看。事实上在两者中还存在一种结合体quickList

结构演变

  • 在上面我们添加了一个key为zlist的数据。通过object encoding zlist查看底层就是通过quicklist来构建的。之前在ziplist章节汇总我们了解到在redis中hash和list基本数据结构都使用了ziplist存储数据的。在list中我们确实quicklist。这里我们提前说明下quicklist内部就是基于ziplist来实现的。

linkedList

  • 在开场quicklist之前我们简单梳理下之前学过的linkedList ,他是一种常见的双线链表。通过两个指针完成我们链表的构建。

C++指针

  • redis是基于内存运行的,而内存有十分的宝贵所以redis在设计了双线链表后觉得有点耗内存。因为指针本身也是需要开辟空间的。根据系统的不同指针占位不同。这里我总结了一下一个指针占位就是一个系统操作的基本位
  • 这里基本位是什么意思呢?加入你是64位系统那么一个指针就是64位即8个字节。如果你是32位系统那么一个指针就是32位即4个字节
  • 也就是说如果我在redis中向双向链表中存储N个英文字母,我们又知道一个应为字母占1个字节。那么这N个元素就是N的listNode . 那么维持着N个listNode中间就需要2*(N-1)个指针。在64位系统中也就是我们需要开辟将近129倍的空间来存储内容。上述情况我们只有N个字节的内容,却需要2*(N-1)*8+N个字节来构建listNode。
  • 随着节点的递增我们浪费程度越离谱。所以redis在双向链表的基础上结合了ziplist进行改良。

过渡原因

ziplist

  • 在ziplist章节中我们知道ziplist是一块连续内存,是redis对内存的一种改良结构。ziplist实现了内存的高使用率!

linkedlist+ziplist好处

quicklist引入

  • quicklist是在redis3.2之后引入的,笔者这里使用的是redis6.4方便源码好像并没有quicklist源码。
  • 后来翻阅了之后redis6.4好像取消了quicklist . 结构。所以我又特别下了一个3.2的版本。这里具体的是redis3.2.4版本!!!

庐山真面目

quicklist

  • 通过他的源码我们很清晰的看出他的内部数据结构!这个大家应该很熟悉了。quicklist可以说就是我们之前的linkedList 结构。内部就是双向链表只不过里面的属性稍微多了点

  • 通过图示是不是感觉和linkedList一样。

  • 接下来我们看看quicklist中各个属性的含义吧

quicklistNode

  • quicklist只是一个抽象的概念,真正负责数据的存储的是组成quicklist的成员quicklistNode 。

  • 各个属性的作用

  • 通过上面的属性介绍,我们也可以了解了解到node节点中的数据结构就是ziplist 。在ziplist基础上会在进行压缩达到内存更高的使用效率!

  • 关于压缩这里我们不用太去了解!主要目的就是一种编码,这种编码是无法真正使用的在使用期间redis会进行解码操作。在解码操作期间就是通过recompress属性来标记的。

insert

  • 在了解quicklist基本结构之后我们在看看insert时结构会发生哪些变化!上面我们也提到了在redis.conf配置文件中list-max-ziplist-size属性是用来设置quicklist中每个节点中的ziplist存储的大小设置的。
属性值 作用
-1 每个quicklistNode节点的ziplist所占字节数不能超过4kb
-2 每个quicklistNode节点的ziplist所占字节数不能超过8kb
-3 每个quicklistNode节点的ziplist所占字节数不能超过16kb
-4 每个quicklistNode节点的ziplist所占字节数不能超过32kb
-5 每个quicklistNode节点的ziplist所占字节数不能超过64kb
int ziplist包含的entry上限

两端插入

  • 第一种情况就是我们需要插入的数据是在两端的。如上图所示我们在redis.conf配置文件中设置的list-max-ziplist-size: 2 。表示内部节点ziplist中entry个数最大为2 。此时我们head头部节点中已经存储了两个内容,tail尾部节点存储的是1个节点!
  • 这个时候如果我们想头部添加一个元素是obj1 。 可想而知我们是无法加入的,这个时候redis会重新创建一个ziplist结构并包含obj1 ,将新创建的ziplist加入到链表的头部之后

  • 而obj2加入尾结点时,因为尾结点的节点数是1还未达到峰值2,所以直接就加入了。最终的效果图如下

中间插入

Created with Raphaël 2.3.0Insertziplist是否可以容纳向ziplist中插入插入位置在ziplist两端相邻ziplist是否可以容纳插入相邻的ziplist中新建ziplist插入将该ziplist拆分两个ziplist, 在对应位置加入yesnoyesnoyesno

总结

参考文献

lzf压缩算法

【redis前传】集思广益之quicklist,取其精华去其糟粕相关推荐

  1. 快速掌握Python的捷径-Python基础前传(1)

    文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事.  方丈高楼平地起,无 ...

  2. 创业者周鸿祎前传(西安交大时期)

    以下这篇博文来自西安交大兵马俑BBS(6月13日),作者自称是周鸿祎的同级同学"Kevin". 里面颇有不少八卦题材,值得一读.这是创业者周鸿祎的部分前传啊! 以下为原文,有删节: ...

  3. 5G 承载网 — 前传、中传、回传

    目录 文章目录 目录 前传(AAU <=> DU) 中传(DU <=> CU)和回传(CU <=> 5GC) 5G 承载协议架构图 承载基础协议 新技术特性 5G ...

  4. 编程十年 (2):前传2——哪有这么牛逼的游戏机?

    编程十年 (2):前传2--哪有这么牛逼的游戏机? 本文地址:http://www.cnblogs.com/AndersLiu/archive/2011/04/19/programming10year ...

  5. DayDayUp:《机器崛起前传》第二十二章【蹒跚而来】读后感(文章源自网络)—听课笔记

    DayDayUp:<机器崛起前传>第二十二章[蹒跚而来]读后感(文章源自网络)-听课笔记 <机器崛起前传> 1.机器岂不能有自我?         计算机的发展历程可谓蹒跚.从 ...

  6. 跟老杨学java系列(一)前传

    跟老杨学java系列(一)前传 首先声明一下哈,本人文笔水平有限,不喜勿喷.欢迎大家留言探讨技术问题.其他问题概不回复. 上台来首先做个自我介绍(~~偷师相声开场白),本人从事IT开发行业快二十个年头 ...

  7. Vue.js 入门指南之“前传”(含sublime text 3 配置)

    题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的"入门",就算是"入门指南&quo ...

  8. SpringMVC前传--从Struts 1.x-2.x MVC-Spring 3.0 MVC

    SpringMVC前传--从Struts 1.x-2.x MVC-Spring 3.0 MVC http://downpour.iteye.com/blog/1330537 在我们熟知的建立在三层结构 ...

  9. 无源波分和彩光模块_5G前传WDM解决方案,无源波分和彩光模块

    原标题:5G前传WDM解决方案,无源波分和彩光模块 5G承载网一般分为城域接入层,城域汇聚层和城域核心层/省干线,来实现5G业务的前传.中传和回传.而光模块主要用于实现各层设备之间的互连,5G前传是城 ...

最新文章

  1. 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能
  2. 蜜糖变砒霜:90%美国公司区块链项目将不再重启
  3. web设计经验一 提升移动设备响应式设计的8个建议
  4. ProxyStrike运行bug解决办法
  5. 分享Kali Linux 2016.2第50周镜像文件
  6. chrome安装或者重装 【windows】
  7. 自建K8S迁移镜像、应用至阿里云ACK最佳实践
  8. CentOS 7安装TigerVNC Server
  9. 支持各硬件平台的机器学习模型 AWS发表新开源项目
  10. cmd52命令发送 mmc_乾坤合一~Linux SD/MMC/SDIO驱动分析
  11. java前端开发JD
  12. PowerBI使用Tabular Editor翻译报表模型
  13. Delphi 11.0 Alexandria 来了
  14. 苹果CMSV10黑色自适应简约炫酷影视网站模板
  15. JSP Commons-FileUpload 组件实现文件上传
  16. ubuntu中修改只读文件
  17. 无法支持计算机上的硬件,电脑经常弹出“不支持的硬件”怎么办?
  18. Python实现猜词游戏 Hangman Game(不带提示和带提示版本)
  19. java di是什么_java spring中DIP是什意思?DI的含义是什么?
  20. 初识MIMO(二):MIMO的信道容量及其仿真

热门文章

  1. DNS原理、进阶、编译
  2. Springboot整合WebSocket实现网页版聊天,快来围观!
  3. ASP.NET(基于C#)及Sql Server2008网页项目学习总结
  4. Linux性能优化-内存的swap
  5. scrapy爬取起点小说网
  6. linux操作系统的cron服务用于管理,Linux的系统管理
  7. 一款免费的Excel作图插件
  8. MMC、CE-ATA、SD、TF、SDIO的异同
  9. dns安全可视化 设计
  10. 又来汇丰软件(广东)的帖子了。。。