Redis设计与实现 第 3 章

第 3 章 链表

链表在 Redis 中应用广泛,如列表键的底层实现之一是链表

  • 当一个列表键包含了数量比较多的元素
  • 列表中包含的元素都是比较长的字符串时

integers

integers 列表键包含了 [1, 1024] 共 1024 个整数,其底层实现就是链表,每个节点都保存了一个整数值

发布与订阅、慢查询、监视器等功能也使用到了链表,Redis 服务器本身也使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区

3.1 链表和链表节点的实现

每个链表节点使用一个 adlist.h/listNode 结构来表示

ListNode

多个 listNode 通过 prev 和 next 指针组成双端链表

双端链表

使用 adlist.h/list 来使用链表会方便

list

提供表头指针 head、表尾指针 tail,链表长度计数器 len

dup、free、match 成员为使用实现多态链表所需的类型特定函数

  • dup:复制链表节点所保存的值
  • free:释放链表节点所保存的值
  • match:对比链表节点所保存的值和另一个输入值是否相等

链表举例:

链表

特性:

  • 双端:链表节点有 prev、next 指针,获取某个节点的前置、后置的复杂度为 O(1)
  • 无环:表头节点的 prev 指针和表尾的 next 指针都指向 NULL,对链表的访问以 NULL 为终点
  • 带有表头指针和表尾指针:获取表头节点和表尾节点的复杂度都为 O(1)
  • 带有链表长度的计数器:获取链表节点数量的复杂度为 O(1)
  • 多态:节点使用 void* 指针来保存节点的值,并可以通过dup、free、match 三个属性为节点值设置类型的特定函数,来保存各种不同类型的值

3.2 链表和链表节点的 API

链表API

posted @ 2021-06-15 15:50  zephxu  阅读(31)  评论(0)    收藏  举报