Redis 链表

164 阅读1分钟

作为一种常用的数据结构,链表内置在很多高级编程语言里面,因为Redis使用C元并没内置这种数据结构,所以Redis构建了自己的链表实现。链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用俩表作为列表建的底层实现。链表提供了高效的节点重拍能力,以及顺序性的节点访问方式,并且通过增删节点来灵活的调整链表的长度。

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

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;

Redis的链表特点:

1)双端,链表节点带有prev和next指针,获取节点的前置和后置节点;

2)无环,表头节点的prev和表尾的next都是空指针;

3)带表头指针和表尾指针,通过list结构的head和tail指向表头节点和表尾节点;

4)带链表长度计数器:list结构的长度通过len属性记录;

5)多态,链表节点可以使用void *指针保存节点值,并且可以通过list结构的dup,free,match三个属性为节点值设置类型特定函数,用于保存不同类型的值。