环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation
参考书籍:《redis的设计与实现》
文章推荐:
redis源码阅读-一--sds简单动态字符串
redis源码阅读--二-链表
redis源码阅读--三-redis散列表的实现
redis源码浅析--四-redis跳跃表的实现
redis源码浅析--五-整数集合的实现
redis源码浅析--六-压缩列表
redis源码浅析--七-redisObject对象(下)(内存回收、共享)
redis源码浅析--八-数据库的实现
redis源码浅析--九-RDB持久化
redis源码浅析--十-AOF(append only file)持久化
redis源码浅析--十一.事件(上)文件事件
redis源码浅析--十一.事件(下)时间事件
redis源码浅析--十二.单机数据库的实现-客户端
redis源码浅析--十三.单机数据库的实现-服务端 - 时间事件
redis源码浅析--十三.单机数据库的实现-服务端 - redis服务器的初始化
redis源码浅析--十四.多机数据库的实现(一)--新老版本复制功能的区别与实现原理
redis源码浅析--十四.多机数据库的实现(二)--复制的实现SLAVEOF、PSYNY
redis源码浅析--十五.哨兵sentinel的设计与实现
redis源码浅析--十六.cluster集群的设计与实现
redis源码浅析--十七.发布与订阅的实现
redis源码浅析--十八.事务的实现
redis源码浅析--十九.排序的实现
redis源码浅析--二十.BIT MAP的实现
redis源码浅析--二十一.慢查询日志的实现
redis源码浅析--二十二.监视器的实现
一 数据结构的定义
/* Node, List, and Iterator are the only data structures used currently. */
typedef struct listNode {
struct listNode *prev;//前置节点
struct listNode *next;//后置节点
void *value; //节点值
} listNode;
//list用来持有链表
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;
链表的结构如下图:
二.链表的API
链表相对比较简单,下边是adlist.h对链表api的定义
/* Prototypes */
list *listCreate(void); //创建一个不包含节点的空链表
void listRelease(list *list); //释放链表以及他的节点
void listEmpty(list *list); //只释放链表中的节点
list *listAddNodeHead(list *list, void *value);//从头部插入一个节点
list *listAddNodeTail(list *list, void *value);//从尾部插入一个节点
//从old_node节点插入一个值,after参数:是从old_node节点前插入还是后插入
list *listInsertNode(list *list, listNode *old_node, void *value, int after);
void listDelNode(list *list, listNode *node); //删除节点
listIter *listGetIterator(list *list, int direction); //获取个节点的迭代器
listNode *listNext(listIter *iter); //获取节点的下一节点 ,iter觉得方向,从头部还是从尾部
void listReleaseIterator(listIter *iter);//释放迭代器
list *listDup(list *orig); //复制的链表
listNode *listSearchKey(list *list, void *key); //搜索节点
listNode *listIndex(list *list, long index); //
void listRewind(list *list, listIter *li); //重置迭代器 到头部
void listRewindTail(list *list, listIter *li);//重置迭代器 到尾部
void listRotate(list *list);//
void listJoin(list *l, list *o);