作为一种常用的数据结构,链表内置在很多高级编程语言里面,因为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三个属性为节点值设置类型特定函数,用于保存不同类型的值。