您的位置:首页 > 数据库 > Redis

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

2016-03-20 10:15 716 查看

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: