Redis的设计和实现笔记-第三章 链表

Redis的链表

因为C语言并没有内置的链表数据结构,所以Redis自己实现了链表。链表是列表数据结构的底层实现对象。Redis除了链表键外,发布与订阅,慢查询,监视器等功能也用到链表。Redis服务器本身还使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区。

链表的定义

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

同时定义了list结构来方便操作链表

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;

通过list可以方便的操作一个链表的头尾指针,获取链表长度。dup、free和match成员则是用于实现多态链表所需的类型特定函数。

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

Redis链表的特性

  1. 双向链表。通过prev和next指针可以方便的访问前置和后置节点。
  2. 无环。头节点和尾节点都指向null,对链表的访问以null为终点。
  3. 通过头节点和尾节点指针,可以直接访问头尾节点。
  4. 通过len属性可以直接过去到链表长度。
  5. 多态。通过dup和free和match三个指针函数,可以实现操作不同的数据类型。 Ps:但是最起码在一个list内的数据类型应该是一致的。从代码来看应该是不支持在一个list内使用不同的数据类型的。