Redis源码阅读-链表部分-

链表数据结构在Adlist.h   Adlist.c

Redis的链表是双向链表,内部定义了一个迭代器。

双向链表的函数主要是链表创建、删除、节点插入、头插入、尾插入、第N个节点、节点迭代遍历、链表复制、链表rotate、节点删除

typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value; //定义为void *类型,方便用户自行使用自己的数据结构
} listNode; typedef struct listIter {
listNode *next;
int direction;
} listIter; 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; /* Functions implemented as macros */
#define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)
#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value) #define listSetDupMethod(l,m) ((l)->dup = (m))
#define listSetFreeMethod(l,m) ((l)->free = (m))
#define listSetMatchMethod(l,m) ((l)->match = (m)) #define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match) /* Prototypes */
/*创建链表*/
list *listCreate(void);
/*释放链表*/
void listRelease(list *list);
/*在头部添加节点*/
list *listAddNodeHead(list *list, void *value);
/*在尾部添加节点*/
list *listAddNodeTail(list *list, void *value);
/*在old_node的前面或者后面插入一个为value的节点*/
list *listInsertNode(list *list, listNode *old_node, void *value, int after);
/*在old_node的前面或者后面插入一个为value的节点*/
void listDelNode(list *list, listNode *node);
/*创建一个链表迭代器, direction代表迭代器的方向,向前或者向后*/
listIter *listGetIterator(list *list, int direction);
/*迭代器向下一个移动*/
listNode *listNext(listIter *iter);
/*释放链表迭代器*/
void listReleaseIterator(listIter *iter);
/*复制链表,返回复制后的链表*/
list *listDup(list *orig);
/*查找值为key的节点,如果定义了match函数,则使用match函数来比较key是否相等*/
listNode *listSearchKey(list *list, void *key);
/*返回链表第index个节点,index从0开始*/
listNode *listIndex(list *list, long index);
/*链表迭代器重置,指向头结点*/
void listRewind(list *list, listIter *li);
/*链表迭代器重置,指向尾结点*/
void listRewindTail(list *list, listIter *li); /*链表的最后一个节点移到最前面, rotate*/
void listRotate(list *list); /* Directions for iterators */
/*迭代器方向:向后或者向前*/
#define AL_START_HEAD 0
#define AL_START_TAIL 1

Redis源码阅读-Adlist双向链表的更多相关文章

  1. Redis源码阅读(二)高可用设计——复制

    Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...

  2. Redis源码阅读(六)集群-故障迁移(下)

    Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...

  3. Redis源码阅读(五)集群-故障迁移(上)

    Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...

  4. Redis源码阅读(四)集群-请求分配

    Redis源码阅读(四)集群-请求分配 集群搭建好之后,用户发送的命令请求可以被分配到不同的节点去处理.那Redis对命令请求分配的依据是什么?如果节点数量有变动,命令又是如何重新分配的,重分配的过程 ...

  5. Redis源码阅读(三)集群-连接初始化

    Redis源码阅读(三)集群-连接建立 对于并发请求很高的生产环境,单个Redis满足不了性能要求,通常都会配置Redis集群来提高服务性能.3.0之后的Redis支持了集群模式. Redis官方提供 ...

  6. Redis源码阅读(一)事件机制

    Redis源码阅读(一)事件机制 Redis作为一款NoSQL非关系内存数据库,具有很高的读写性能,且原生支持的数据类型丰富,被广泛的作为缓存.分布式数据库.消息队列等应用.此外Redis还有许多高可 ...

  7. [Redis源码阅读]sds字符串实现

    初衷 从开始工作就开始使用Redis,也有一段时间了,但都只是停留在使用阶段,没有往更深的角度探索,每次想读源码都止步在阅读书籍上,因为看完书很快又忘了,这次逼自己先读代码.因为个人觉得写作需要阅读文 ...

  8. Redis源码阅读一:简单动态字符串SDS

    源码阅读基于Redis4.0.9 SDS介绍 redis 127.0.0.1:6379> SET dbname redis OK redis 127.0.0.1:6379> GET dbn ...

  9. Redis源码阅读笔记(1)——简单动态字符串sds实现原理

    首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...

随机推荐

  1. java trim start end space

    Java program that trims starts and ends public class Program { public static String trimEnd(String v ...

  2. 【noip2017 day2T2】【蚯蚓】巧用队列单调性线性处理

    (画师当然是武内崇啦) Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐 ...

  3. 远程debug---远程服务器参数设置

    java  -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=25 -jar  myboot.jar 或者  java ...

  4. python正则表达式-re模块

    目录: 一.正则函数 二.re模块调用 三.贪婪模式 四.分组 五.正则表达式修饰符 六.正则表达式模式 七.常见的正则表达式 导读: 想要使用python的正则表达式功能就需要调用re模块,re模块 ...

  5. 我也来说说js的事件机制

    原文链接:http://www.w3cfuns.com/notes/17398/8062de2558ef495ce6cb7679f940ae5c.html 学js,不懂事件机制,基本可以说学了js,就 ...

  6. c++类型所占的字节和表示范围

    一:数值类型的大杂烩 (1)short.int 和 long 类型都表示整型值.存储空间的大小不同 一般, short 类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机 ...

  7. Jakarta雅加达项目简介

    Jakarta项目是在Apache软件基金会营运的公开源代码软件开发项目之一.开发着面向编程语言Java的程序库,框架等. Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它 ...

  8. 对中级 Linux 用户非常有用的 20 个命令

    FROM:http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 21. 命令: Find ...

  9. postman里面的mockserver使用方法

    转载:http://blog.csdn.net/Cloud_Huan/article/details/78326159 首先说下mockserver是干啥的,从英文翻译理解就是模拟一个服务器,通俗点说 ...

  10. iOS: 学习笔记, 加入一个带界面约束的控制器

    1. 创建一个空iOS应用程序(Empty Application). 2. 加入加控制器类. 改动控制器类的viewDidLoad - (void)viewDidLoad { [super view ...