目录

一、链表在Redis中的作用

二、链表实现

1. 结构

1.1 链表节点结构

1.2 链表结构

2 链表和链表节点的API


一、链表在Redis中的作用

  • 链表键
  • 发布与订阅
  • 慢查询
  • 监视器
  • 保存客户端状态信息
  • 构建客户端输出缓冲区
  • ...

二、链表实现

1. 结构

1.1 链表节点结构

adlist.h/listNode,如下:

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

1.2 链表结构

双端链表结构如下图:

链表结构源码如下:

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

特性:

  • 双端
  • 无环
  • 带表头指针和表尾指针
  • 带链表长度计数器
  • 多态

2 链表和链表节点的API

函数作用时间复杂度
listSetDupMethod将给定的函数设置为链表的节点值复制函数O(1)
listGetDupMethod

返回链表当前正在使用的节点值复制函数

O(1)
listSetFreeMethod将给定的函数设置为链表的节点值释放函数

O(1)

listGetFree返回链表当前正在使用的节点值释放函数O(1)
listSetMatchMethod将给定的函数设置为链表的节点值对比函数O(1)
listGetMatchMethod返回链表当前正在使用的节点值对比函数O(1)
listLength返回链表的长度O(1)
listFirst返回链表的表头节点O(1)
listLast返回链表的表尾节点O(1)
listPrevNode返回给点节点的前置节点O(1)
listNextNode返回给点节点的后置节点O(1)
listNodeValue返回给定节点目前正在保存的值O(1)
liistCreate创建一个不包含任何节点的新链表O(1)
listAddNodeHead将一个包含给定值的新节点添加到给定链表的表头O(1)
listAddNodeTail将一个包含给定值的新节点添加到给定链表的表尾O(1)
listInsertNode将一个包含给定值的新节点添加到给定节点的之前或者之后O(1)
listSearchKey查找并返回链表中包含给定值的节点O(N)
listIndex返回链表在给定索引上的节点O(N)
listDelNode从链表中删除给定节点O(N)
listRotate将链表的表尾节点弹出,然后将被弹出的节点插入到链表的表头,成为新的表头节点O(1)
listDup复制一个给定链表的副本O(N)
listRelease释放给定链表,以及链表中的所有节点O(N)

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐