redis 源代码之数据结构(1)--链表的实现

来源:互联网 发布:公众号 回复 php 代码 编辑:程序博客网 时间:2024/05/18 16:56

Redis(Remote Dictionary Server)是一种内存Key/Value数据库。所有的Key/Value都是存放在内存中,如果内存不足,会将一些value swap到硬盘,但是Key始终都在内存中。Redis类似于Memcached。但是redis比memcached有更丰富的数据结构,还可以支持备份,数据持久化(snapshot和aof)。

具体的二者区别可以参考http://blog.csdn.net/gpcuster/article/details/5956555 。

下图是一张是从网上获取的关于redis内部的存储结构(不知道原作者是谁了)。


最近在阅读redis源代码,决定将自己的一些理解记下来,用于备份和检查。无奈技术水平很挫,如果有错误,还希望指正。代码版本是2.6.2,代码量比2.4.17大了很多。==!

 adlist.h 定义了一个双链表结构。typedef struct listNode {struct listNode *prev;struct listNode *next;void *value;} listNode;
typedef struct listIter {listNode *next;int direction;} listIter;
typedef struct list {listNode *head;listNode *tail;void *(*dup)(void *ptr); //用于节点value的copyvoid (*free)(void *ptr); //用于节点value的释放int (*match)(void *ptr, void *key); //节点value的比较unsigned long len; //链表的长度} list;
adlist 提供的链表操作都是很常见的,节点value的内存分配和释放由用户负责。

list *listInsertNode(list *list, listNode *old_node, void *value, int after) ;//根据after是否为0来决定是在old_node节点之前(after == 0)还是之后(after != 0)

listNode *listIndex(list *list, long index);//返回链表中下标为index的节点,0为head节点,1为head->next节点,以此类推。若index为负数,则从后向前,-1为tail节点,-2为
tail->prev 节点以此类推。

list 数据结构不是太难理解~ 下文将会分析sds数据结构(作者自定义的字符串)

原创粉丝点击