引言
redis的链表和我们数据结构中学学过的链表并没有什么太大区别,唯一不同的地方就是redis链表是通过一个void *value来保存数据,因此redis中 的链表能够存储任意类型的数据。
redis中链表的实现
redis中的链表其实是个双端链表,能够在链表的表头和表尾插入数据。链表的定义如下图所示:
此处list结构体相当于链表的表头节点,拥有head和tail字段分别指向链表的表头与表尾,同时
有三个函数指针提供三种对链表节点操作的方法。(这里设置函数指针的原因是因为listNode中存储数据用的是void *value,因为在实际使用的时候需要重写这三个函数,完成数据格式的转换。)链表具体结构如下:
迭代器必然也不可或缺,其结构如下图所示:
redis可以通过以下函数通过迭代器对链表进行遍历。
/* Directions for iterators
*
* 迭代器进行迭代的方向
*/
// 从表头向表尾进行迭代
#define AL_START_HEAD 0
// 从表尾到表头进行迭代
#define AL_START_TAIL 1
listIter *listGetIterator(list *list, int direction);
listNode *listNext(listIter *iter);