Redis开源代码读书笔记五(adlist模块)
来源:互联网 发布:2017淘宝天猫商家数目 编辑:程序博客网 时间:2024/04/30 20:16
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)
0 0
- Redis开源代码读书笔记五(adlist模块)
- Redis开源代码读书笔记三(zmalloc模块)
- Redis开源代码读书笔记六(sds模块)
- Redis开源代码读书笔记七(ae模块)
- Redis开源代码读书笔记八(anet模块)
- Redis开源代码读书笔记九(Object模块)
- (redis)adlist.h/adlist.c理解
- Redis源码分析(adlist)
- Redis之2-双端链表(adlist.c,adlist.h)
- Redis adlist
- Redis开源代码读书笔记一(介绍)
- Redis开源代码读书笔记二(源代码及工程结构)
- redis源码阅读(2)---- adlist分析
- redis学习笔记(2)---链表adlist
- redis源码分析(9)redis源码链表学习总结 adlist.h adlist.c
- redis之adlist
- redis源码分析(adlist)
- Redis开源代码读书笔记四(redis-server主程序, redis.c)
- android之startActivityForResult
- Hadoop,Zookeeper和Hbase安装
- 16进制加法
- ThinkPHP 常用配置 和 四种url访问方式
- ProgressDialog使用总结
- Redis开源代码读书笔记五(adlist模块)
- Objective-C中KVO简单用法
- 基于Kubernetes构建Docker集群管理详解
- 信仰的力量:两个家族200年后的统计
- openssl相关指令及生成私有证书
- 进入Docker容器
- 第4周项目5 返回Fibnacci序列中的第n个数
- 15 API-集合(Collection(功能,迭代器),List(List特有迭代器,并发异常),常见数据结构图示(栈,队列,数组,链表))&对象数组
- zTree理解和简单Demo