Redis 底层数据结构之链表

文章参考:《Redis设计与实现》黄建宏

链表

链表提供了高效的节点重排能力,以及可以顺序访问,也可以通过增删节点灵活调整链表长度,Redis中的列表、发布订阅、慢查询、监视器等功能均用到了链表。

链表和链表节点的实现

链表节点的定义

typedef struct listNode {
  // 前置节点
  struct listNode *prev;
  // 后置节点
  struct listNode *next;
  // 节点的值
  void *value;
}listNode;

多个 listNode 可以组成双端链表

image-20210704224545238

虽然这样可以组成一个链表, 但是使用 list 结构来持有链表,操作更方便, 提供了表头指针 head,表尾指针 tail、 以及链表长度计数器 len, 而 dup、 free、match 成员则是用于实现多台链表

typedef struct list {
  // 表头节点
  listNode *head;
  // 表尾节点
  listNode *tail;
  // 链表包含节点数量
  unsigned long len;
  // 节点值复制函数
  void *(*dup) (void *ptr);
  // 节点值释放函数
  void (*free) (void *ptr);
  // 节点值对比函数
  int (*match) (void *ptr, void *key);
}list;

image-20210704225103562

Redis 链表的特性如下:

  1. 双端: 获取节点的前置节点和后置节点复杂度都是 O(1)
  2. 无环:头部和尾部都是以 NULL 节点为终点
  3. 表头和表尾指针:程序获取链表头尾节点复杂度是 O(1)
  4. 长度计数器: 获取链表中节点数量复杂度是 O(1)
  5. 多态:节点使用 void * 指针来保存节点值,可以表示不同数据类型
posted @ 2021-07-04 23:00  邱佳飞  阅读(61)  评论(0)    收藏  举报