17- Redis 中的 quicklist 数据结构

在 Redis 3.0 之前,List 对象的底层数据结构是双向链表或者压缩列表,然后在 Redis 3.2 的时候,List 对象的底层改由 quicklist 数据结构实现。

其实 quicklist 就是【双向链表 + 压缩列表】组合,因为一个 quicklist 就是一个链表,而链表中的每个元素又是一个压缩列表。

在前面讲压缩列表的时候,提到过压缩列表的不足,虽然压缩列表是通过紧凑型的内存布局节省了内存开销,但是因为它的结构设计,如果保存的元素数量增加,或者元素变大了,压缩列表会有【连锁更新】的风险,一旦发生,会造成性能下降。

quicklist 解决办法,通过控制每个链表节点中的压缩列表的大小或者元素个数,来规避连锁更新的问题,因为压缩列表元素越少或越小,连锁更新带来的影响就越小,从而提供了更好的访问性能。

1. quicklist 结构设计

quicklist 的结构体跟链表的结构体类似,都包含了表头和表尾,区别在于 quicklist 的节点是 quicklistNode。

typedef struct quicklist {
    // quicklist 的链表头
    quicklistNode *head;
    // quicklist 的链表尾
    quicklistNode *tail;
    // 所有压缩列表中的总元素个数
    unsigned long count;
    // quicklistNode 的个数
    unsigned long len;
    ...
} quicklist;

接下来,是quicklistNode 的结构定义:

typedef struct quicklistNode {
    // 前一个 quicklistNode
    struct quicklistNode *prev;
    // 下一个 quicklistNode
    struct quicklistNode *next;
    // quicklistNode 指向的压缩列表
    unsigned char *zl;
    // 压缩列表的字节大小
    unsigned int sz;
    // 压缩列表的元素个数
    unsigned int count : 16;
    ...
} quicklistNode;

可以看到,quicklistNode 结构体里包含了前一个节点和下一个节点指针,这样每个 quicklistNode 形成了一个 双向链表,但是链表节点的元素不再是单纯保存元素值,而是保存了一个压缩列表,所以 quicklistNode 结构体里有个指向压缩列表的指针 *zl。

如下:

在向 quicklist 添加一个元素的时候,不会像普通的链表那样,直接新建一个链表节点,而是会检查插入位置的压缩列表是否能容纳该元素,如果能容纳就直接保存到 quicklistNode 结构里的压缩列表,如果不能容纳,才会新建一个新的 quicklistNode 结构。

quicklist 会控制 quicklistNode 结构里的压缩列表的大小或者元素个数,来规避潜在的连锁更新的风险,但是这并没有完全解决连锁更新的问题。

相关推荐

  1. Redis常用数据结构

    2024-06-07 15:02:03       15 阅读
  2. Redis 字符串数据结构详解及字符串命令

    2024-06-07 15:02:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 15:02:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 15:02:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 15:02:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 15:02:03       18 阅读

热门阅读

  1. 嵌入式学习——3——域套接字UNIX

    2024-06-07 15:02:03       8 阅读
  2. FFmpeg 使用文档介绍二:命令行选项

    2024-06-07 15:02:03       11 阅读
  3. 延迟队列的时间轮算法实现

    2024-06-07 15:02:03       6 阅读
  4. 如何看待知乎入局 「AI整合商」 赛道

    2024-06-07 15:02:03       10 阅读
  5. PostgreSQL Windows 数据库主从模式 热同步

    2024-06-07 15:02:03       9 阅读
  6. React 和 Vue的跨端|跨平台框架介绍

    2024-06-07 15:02:03       8 阅读
  7. Mysql中表的常用约束

    2024-06-07 15:02:03       9 阅读
  8. 邮件地址搜索软件

    2024-06-07 15:02:03       9 阅读