redis原理之底层数据结构(三)-quicklist

1.绪论

前面讲过的ziplist在查找元素的时候是o(n)的复杂度,如果ziplist长度太长,会导致查找元素很缓慢,而ziplist是拥有内存连续的优势,为了保留ziplist内存连续的优势,但是又不能保留太长的长度,我们出现了quicklist,quicklist其实就是将多个ziplist通过指针链接成一个双端链表。

2.组成

typedef struct quicklist {
    //quciklist的头指针
    quicklistNode *head;
    //quicklist的尾指针
    quicklistNode *tail;
    //quicklist的entry个数,由于quicklist是由多个ziplist组成,这里包含的是quicklist下面所有的ziplist所有的entry个数
    unsigned long count;        /* total count of all entries in all ziplists */
    //quicklist中节点的个数
    unsigned long len;          /* number of quicklistNodes */
    //表示quicklist中每个ziplist节点的大小,默认为16个entry节点
    int fill : QL_FILL_BITS;              /* fill factor for individual nodes */
    //表示压缩深度,比如为1,只压缩首尾两个节点
    unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0=off */
    unsigned int bookmark_count: QL_BM_BITS;
    quicklistBookmark bookmarks[];
} quicklist;

可以看出,quickList是由多个ziplist组成的一个双向链表,其中有两个属性需要注意,分别是fill和compress。
fill:表示每个ziplist最多包含的entry数量或者大小。可以通过list-max-ziplist-entries进行设置如果为正,表示最多包含多少个entry,如果为负的话,表示含义如下:

-1 最多4kb
-2 最多8kb
-3 最多16kb
-4 最多32kb
-5 最多64kb

compress:表示是压缩数量,如果为-1表示只压缩首尾两个节点,默认也是如此

typedef struct quicklistNode {
    //上一个节点指针
    struct quicklistNode *prev;
    //下一个节点指针
    struct quicklistNode *next;
    //ziplist,真正存储数据的地方
    unsigned char *zl;
    //ziplist的大小
    unsigned int sz;             /* ziplist size in bytes */
    //ziplist的字节数量
    unsigned int count : 16;     /* count of items in ziplist */
    //是否开启了压缩
    unsigned int encoding : 2;   /* RAW==1 or LZF==2 */
    unsigned int container : 2;  /* NONE==1 or ZIPLIST==2 */
    //该节点是否已经被压缩过
    unsigned int recompress : 1; /* was this node previous compressed? */
    unsigned int attempted_compress : 1; /* node can't compress; too small */
    //保留字段
    unsigned int extra : 10; /* more bits to steal for future usage */
} quicklistNode;

所以双端链表的组成如下

相关推荐

  1. Redis底层原理数据结构与持久化机制

    2024-07-17 02:34:05       44 阅读
  2. 6、Redis系统-数据结构-07-QuickList

    2024-07-17 02:34:05       23 阅读
  3. redis底层数据结构ziplist实现

    2024-07-17 02:34:05       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 02:34:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 02:34:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 02:34:05       58 阅读
  4. Python语言-面向对象

    2024-07-17 02:34:05       69 阅读

热门阅读

  1. SQL进阶--条件分支

    2024-07-17 02:34:05       22 阅读
  2. workingset protection/detection on the anonymous LRU list

    2024-07-17 02:34:05       21 阅读
  3. WSGI 服务器教程:`write` 方法解析

    2024-07-17 02:34:05       22 阅读
  4. LeetCode 算法:组合总和 c++

    2024-07-17 02:34:05       22 阅读
  5. Linux 工作队列(Workqueue):概念与实现

    2024-07-17 02:34:05       25 阅读
  6. P1179 [NOIP2010 普及组] 数字统计【进制】

    2024-07-17 02:34:05       23 阅读
  7. PHP基础认知

    2024-07-17 02:34:05       21 阅读
  8. 探索Eureka的高级用法:在服务中实现分布式锁

    2024-07-17 02:34:05       21 阅读
  9. Rust编程-函数式编程

    2024-07-17 02:34:05       24 阅读
  10. 前端打包部署后源码安全问题总结

    2024-07-17 02:34:05       23 阅读
  11. 前端实现调用ChatGPT

    2024-07-17 02:34:05       23 阅读
  12. 萝卜快跑的「悖论」

    2024-07-17 02:34:05       23 阅读