前言

redis的quicklist 其实是linkedlist 与ziplist的结合体

linkedlist

linkedlist 是一种双线链表

ziplist

ziplist 也叫压缩列表,它内部的数据存储是一段连续的空间

特点
● 列表对象保存的字符串元素的长度都小于64个字节
● 列表对象保存的元素小于512个
在redis3.2时如果以上条件没有满足的换将会选用linkedlist作为底层实现

quicklist

quicklist是在redis3.2之后引入的quicklist其实现也是依赖于ziplist和linkedlist来实现的,它是两个结构的结合。它将ziplist来进行分段存储,也就是分成一个个的quicklistNode节点来进行存储。每个quicklistNode指向一个ziplist,然后quicklistNode之间是通过双向指针来进行连接的

为什么要把底层数据结构优化成quicklist?

  1. ziplist这个结构,它内部的数据存储是一段连续的空间,这样的话,就要求很大一块内存空间。就比如说,我们想存储很多的数据,但是内存中并没有符合要求的连续的存储空间,而是存在很多不连续的小空间(加起来可以符合要求)。
  2. 再来说说linkedlist这个结构,它数据存储不要求连续,就可以避免上面的弊端,不过这样以来,每个节点都分配一个一块内存,那就有可能造成大量的内存碎片
    综上两个考虑,redis在3.2版本以后就对此情况进行了优化,就出来了quicklist这个数据结构,quicklist其实就是一个分段的ziplist,为什么这么说呢?其实quicklist存储数据基本单位是quicklistNode
    扩展学习
    https://www.yuque.com/u2457372/vvicfx/xkoih9#LiH1U

汝何不上九霄
4.6k 声望1.6k 粉丝