您的位置:首页 > 理论基础 > 数据结构算法

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

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

具体的二者区别可以参考/article/2548174.html

下图是一张是从网上获取的关于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数据结构(作者自定义的字符串)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: