redis数据结构之list

181 阅读1分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

4redis数据结构之list

redis构建了自己的链表实现

每个链表节点使用adlist.h里的listNode结构来表示:

/*
 * 链表节点
 */
typedef struct listNode {

    // 前驱节点
    struct listNode *prev;

    // 后继节点
    struct listNode *next;

    // 值
    void *value;

} listNode;

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

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函数用于实现多态链表

redis 的链表实现特性:

  • 双端链表:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度为O(1)
  • 无环链表:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)
  • 带链表长度计数器:使用len属性来记录链表长度,获取节点数量的复杂度为O(1)
  • 多态:可以保存不同类型的值

链表被广泛用于实现redis的各种功能,不如列表键,发布与订阅,慢查询,监视器等待。