Redis数据结构-链表

Redis源码学习

Posted by Simon on June 28, 2020

“Better code, better life. ”

Redis数据结构–链表

链表在Redis中使用的非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为底层实现。除链表键外,发布与订阅、慢查询、监视器等功能也用到了链表。

定义

先看一下源码中对链表节点的定义

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
} list;

每个listNode含有一个前向指针和一个后向指针,以及节点的值。

listIter是链表迭代器,它有一个指向下一个元素的next指针和一个方向标志。

list本身包含头尾节点两个指针,和链表长度。另外,有三个函数指针,功能分别为节点复制、节点释放、节点比较。