Redis开源代码读书笔记五(adlist模块)

adlist功能特性


==》支持双链表节点操作(ins, del, add, create, dup, release, search, rotate, index)
==》支持双链表iter操作(get, release, rewind, next)
==》支持列表和节点自定义操作(dup, free, match, prev, next, value)


adlist结构体


typedef struct listNode {

    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

从这个链表节点结构体可以知道adlist是一个双链表操作的模块。

typedef struct listIter {

    listNode *next;
    int direction;
} listIter;

这个是什么,一开始还真的不知道什么意思,后来看了下代码实现,才恍然大悟。虽然以前链表看过,也自己写过,这个迭代节点指针的功能倒是第一次看到。
感觉有点类似Unix下软连接的功能,要是能做得再稍微彻底点,有个类似硬链接或者引用计数功能多好,当然这个也有一些问题,如果有类似功能,资源的释放就比较方便,唯一的问题如果要求线程安全还要引入锁,是不是太繁琐了,所以这里就没有做呢,发散思维,不岔开话题了。

其主要的操作有下面几个:
==》listIter *listGetIterator(list *list, int direction);
==》listNode *listNext(listIter *iter);
==》void listReleaseIterator(listIter *iter);
==》void listRewind(list *list, listIter *li);
==》void listRewindTail(list *list, listIter *li);

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;

这里就非常有意思,尽然list也加入了自己的dup, free, match对应的函数。面向对象编程的思想在这个adlist模块中集成了,方便了list复制,销毁和搜索的实现。

adlist基本接口


list *listCreate(void);
创建链表,返回空指针表示失败

void listRelease(list *list);
释放链表,并在释放过程中采用list的free函数对内部数据进行内存释放;

list *listAddNodeHead(list *list, void *value);
在链表前端增加一个内容为value指向的节点,返回空指针表示失败

list *listAddNodeTail(list *list, void *value);
在链表尾部增加一个内容为value指向的节点,返回空指针表示失败

list *listInsertNode(list *list, listNode *old_node, void *value, int after);
根据after真值判断,在old_node后面或者前面增加一个内容为value指向的节点,返回空指针表示失败

void listDelNode(list *list, listNode *node);
删除list中的node节点

listIter *listGetIterator(list *list, int direction);
创建一个iter迭代指针,返回空指针表示失败

listNode *listNext(listIter *iter);
根据迭代指针配置,步进迭代指针

void listReleaseIterator(listIter *iter);
释放迭代指针

list *listDup(list *orig);
根据dup自定义处理函数进行list的复制,返回空指针表示失败

listNode *listSearchKey(list *list, void *key);
根据match自定义处理函数进行list搜索key内容,返回空指针表示失败

listNode *listIndex(list *list, long index);
根据index编号来进行节点查找,index >= 0正向查找, index < 0 逆向查找

void listRewind(list *list, listIter *li);
定位iter到链表头

void listRewindTail(list *list, listIter *li);
定位iter到链表尾

void listRotate(list *list);

将尾部节点移动到链表头


adlist基本宏操作

节点的私有操作

#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value)

列表的私有操作

#define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)

#define listSetDupMethod(l,m) ((l)->dup = (m))
#define listSetFreeMethod(l,m) ((l)->free = (m))
#define listSetMatchMethod(l,m) ((l)->match = (m))

#define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match)

你可能感兴趣的:(Redis开源代码读书笔记五(adlist模块))