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的copy
void (*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数据结构(作者自定义的字符串)