QuickList
QuickList是Redis3.2版本中新增加的一种数据结构类型,在该版本后替代原有的ZipList+LinkedList的链表底层,成为新的链表底层数据结构。
它的定义在quicklist.c中如下:
A doubly linked list of ziplists. //一个由ziplist组成的双向链表。
通过定义可知,该结构满足原链表底层的需求,且全程使用zipList,无需判断是否需要使用zipList,
(关于ZipList可以看【Redis】压缩列表)
理解
QuickList作为一个双向链表,它的节点存储的是ZipList,而ZipList中又存储了4个entry节点,用来存放数据,这样的话QuickList进行插入或删除操作时非常方便,虽然复杂度为O(n),但是对比之前ZipList的连锁更新机制,不需要大量的内存复制,提高了效率, 而且访问两端元素复杂度为O(1)。
差异
- 在redis3.2之前,原本链表底层是使用ZipList+LinkedList,在<key,value>中的value满足ZipList要求的前提下,默认使用zipList编码形式进行存储,否则将使用linkedList编码形式进行存储。
- 而在redis3.2之后,已经没有曾经的编码转换,默认使用quickList编码形式进行存储。
- QuickList可以理解为将曾经的一整个ZipList转换为多个ZipList的拼接,ZipList本身的设计理念便是舍弃冗余空间来做到节约内存,是一种快查慢增删的数据结构。而QuickList的这种设计方式明显使ZipList的查询速度更上一层楼,在增删方面也通过控制ZipList 的数量来得以优化。
- 在理想状态下,这种设计方式使ZipList在触发连锁更新的时候只会影响到一部分的zipList,使得效率大大提高。(实质上连锁更新概率很低)