redis源码阅读--二-链表

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation

参考书籍:《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;

链表的结构如下图:
redis源码阅读--二-链表_第1张图片
 

 

二.链表的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);

 

你可能感兴趣的:(redis)