Redis链表中有三种基础的数据结构:
1.node
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
表示当前链表中各节点的基础组成。prev表示前向指针,next表示后向指针,value指节点的值。
2.Iterator
typedef struct listIter {
listNode *next;
int direction;
} listIter;
表示当前列表的迭代器,next指当前节点,direction指迭代的方向。
3.list
typedef struct list {
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);
unsigned long len;
} list;
表示当前列表,head为头结点,tail尾节点,*(*dup)(void *ptr)为节点复制操作,(*free)(void *ptr)为节点释放操作,
(*match)(void *ptr, void *key)节点匹配操作,len节点长度。
Redis链表功能
1.list *listCreate(void); 创建链表。
2.void listRelease(list *list); 释放整个链表。
3.list *listAddNodeHead(list *list, void *value); 在链表头结点前加节点,作为新的头结点。
4.list *listAddNodeTail(list *list, void *value) ; 在链表尾节点后加节点,作为新的尾节点。
5.list *listInsertNode(list *list, listNode *old_node, void *value, int after) ;在链表中添加节点,old_node指要添加节点的附近节点,after如果不为0表示要在old_node 后面追加节点,after如果为0表示要在old_node前面追加节点。
6.listDelNode; 删除节点。
7.listIter *listGetIterator(list *list, int direction); 其中direction如果为0表示从头开始迭代,direction如果为1表示从尾部开始迭代。
8.void listReleaseIterator(listIter *iter) 释放迭代器内存。
9.void listRewind(list *list, listIter *li) 重置当前迭代器在链表头,迭代方向为从头开始迭代。
10.void listRewindTail(list *list, listIter *li) 重置当前迭代器在链表尾,迭代方向为从尾开始迭代。
11.listNode *listNext(listIter *iter) 查找当前节点的下一个节点,方向是迭代器定义好的方向。
12.list *listDup(list *orig) 赋值当前整个链表,如果查过内存,返回null。
13.listNode *listSearchKey(list *list, void *key) 。从链表头开始遍历,返回value值为key的节点。
14.listNode *listIndex(list *list, long index) 如果index>0,表示从头开始遍历,1表示头结点的下一个节点,如果index<0,表示从链表尾开始,想前遍历。-1表示尾节点,-2是尾节点的前一个节点。index越界会返回null。
15.void listRotate(list *list) 将链表的尾节点放在链表的头结点处。