Redis五大数据类型之Lists

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

数据结构

链表节点

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

多个listNode组成的链表
Redis五大数据类型之Lists_第1张图片

链表

typedef struct list {
	//表头节点
	listNode *head;
	//表尾节点
	listNode *tail
	//链表包含的节点数量
	unsigned long len;
}

由一个list结构和三个listNode结构组成的链表
Redis五大数据类型之Lists_第2张图片

Redis链表的特性

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

参考《Redis设计与实现》

你可能感兴趣的:(数据库)