链表 -《Redis设计与实现》读书笔记

使用场景

  1. 当列表键包含数量比较多的元素 或者 列表包含的元素都是比较长的字符串时,使用链表实现列表键
  2. 发布与订阅、慢查询、监视器
  3. 用作缓冲区:构建客户端输出缓冲区
  4. 保存多个客户端的状态信息

定义

// 节点
typedef struct listNode {
    // 前置节点
    struct listNode *prev;
    // 后置节点
    struct listNode *next;
    // 节点的值
    // 由于使用void *指针保存节点值,所有可以保存各种不同类型的值
    void *value;
} listNode;

// 迭代器
typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

// 列表
// 特点:双端、无环、带表头表尾指针、带链表长度计数器、多态
typedef struct list {
    // 表头节点
    listNode *head;
    // 表尾节点
    listNode *tail;
    // dup、free、match是用于实现多态链表所需的类型特定函数
    // 节点值复制函数:复制链表节点所保存的值
    void *(*dup)(void *ptr);
    // 节点值释放函数:释放链表节点所保存的值
    void (*free)(void *ptr);
    // 节点值对比函数:对比链表节点所保存的值和另一个输入值是否相等
    int (*match)(void *ptr, void *key);
    // 链表所包含的节点数量
    unsigned long len;
} list;

源码阅读

  1. 文件:src/adlist.h 、 src/adlist.c
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。
原文地址:https://www.cnblogs.com/phonecom/p/15071473.html