链表大家都比较熟悉,以前上学的时候C语言作为入门语言,链表就作为重要的数据结构进行了学习。关于链表的算法和面试题也是层出不穷。今天我要讨论的是Redis的链表。
Redis链表
c语言没有内置的链表的实现,但是它是Redis支持的基本数据结构。
例如对于
redis> lpush gf lucy meimei lala
将会生成一个链表,其中key为”gf”,链表的元素为”lucy”、”meimei”、”lala”
执行
redis> llen gf
将会返回
3
Redis链表结点的定义
typedef struct listNode {
//链表前置节点
struct listNode *prev;
//链表后置节点
struct listNode *next;
//链表节点值
void *value;
}
从Redis链表节点的定义可以看出,Redis链表是双向链表,每个节点存储指向前置和后置节点的指针。
Redis链表的定义
以上是链表节点的定义,链表的定义如下
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为链表定义了头节点指针head、尾节点指针tail、链表的长度len,以及节点值复制函数、节点值释放函数和节点值比较函数。
上图是一个长度为3的redis链表示意图,可以总结出链表的特点如下
- Redis链表是双向链表
- Redis链表无环,头节点前置节点为空,尾节点的后置节点为空
- 获取链表长度时间复杂度为O(1)
- 有头节点指针和尾节点指针
以上,可以看出Redis的链表还是比较简单的,但是它是Redis的基本数据结构。