Redis源码阅读-Adlist双向链表
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双向链表的更多相关文章
- Redis源码阅读(二)高可用设计——复制
Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...
- Redis源码阅读(六)集群-故障迁移(下)
Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...
- Redis源码阅读(五)集群-故障迁移(上)
Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...
- Redis源码阅读(四)集群-请求分配
Redis源码阅读(四)集群-请求分配 集群搭建好之后,用户发送的命令请求可以被分配到不同的节点去处理.那Redis对命令请求分配的依据是什么?如果节点数量有变动,命令又是如何重新分配的,重分配的过程 ...
- Redis源码阅读(三)集群-连接初始化
Redis源码阅读(三)集群-连接建立 对于并发请求很高的生产环境,单个Redis满足不了性能要求,通常都会配置Redis集群来提高服务性能.3.0之后的Redis支持了集群模式. Redis官方提供 ...
- Redis源码阅读(一)事件机制
Redis源码阅读(一)事件机制 Redis作为一款NoSQL非关系内存数据库,具有很高的读写性能,且原生支持的数据类型丰富,被广泛的作为缓存.分布式数据库.消息队列等应用.此外Redis还有许多高可 ...
- [Redis源码阅读]sds字符串实现
初衷 从开始工作就开始使用Redis,也有一段时间了,但都只是停留在使用阶段,没有往更深的角度探索,每次想读源码都止步在阅读书籍上,因为看完书很快又忘了,这次逼自己先读代码.因为个人觉得写作需要阅读文 ...
- Redis源码阅读一:简单动态字符串SDS
源码阅读基于Redis4.0.9 SDS介绍 redis 127.0.0.1:6379> SET dbname redis OK redis 127.0.0.1:6379> GET dbn ...
- Redis源码阅读笔记(1)——简单动态字符串sds实现原理
首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...
随机推荐
- 浅析 Node.js 单线程模型
总结笔记:对于每个用户请求,由主线程接收并存放于一个事件队列中(不做任何处理),当无请求发生时,即主线程空闲,主线程开始循环处理事件队列中的任务: 对于非阻塞JS程序: 1.若某事件需要I/O操作,则 ...
- 反汇编引擎Capstone
反汇编引擎Capstone Capstone是Kali Linux自带的一款轻量级反汇编引擎.它可以支持多种硬件构架,如ARM.ARM64.MIPS.X86.该框架使用C语言实现,但支持C++.P ...
- 每天一个linux命令9之crontab 定时任务
crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此 任务调度命令.crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作. 1语法 ...
- INFORMATION_SCHEMA获取数据库的信息
简介 information_schema这张数据表保存了MySQL服务器所有数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问权限等.再简单点,这台mysql服务器上,到底有哪些数据库.各个 ...
- 解决Eclipse 变量名的自动补全问题
大家使用eclipse敲代码的时候,是不是都被这样一个问题困扰着.就是键入一个变量名的时候,会自动提示补全:在你的变量名后面加上类型的名字!这个时候,你就必须键入Esc才不会自动补全你的变量,如果你键 ...
- 从let和const谈起
注册博客园账号也有好些年了,有事没事经常来逛逛,感觉博客园的同学们一直都很活跃,相比国内其他社区来讲,这里的技术氛围很浓,非常适合学习和交流,所以博主我也决定在这里驻扎了,在这里,博主希望能坚持写一些 ...
- UVa 407
此问题与求上升序列最大和类似,可以作为DAG模型计算.将每一快砖分解为3块,将所有砖块按照底排序,注意sort排序中涉及到底的两个参数x,y,这时候一定要有优先排,比如先排x再排y,不能同时排x和y, ...
- Ubuntu system zabbix-server-3.x install documentation
Installing repository configuration package wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/ ...
- jstl <fmt:formatDate>标签
<fmt:formatDate>标记用于在各种不同的方式来格式化日期 属性: <fmt:formatDate>标签具有以下属性: 属性 描述 必需 默认值 value 要显示的 ...
- 【Hadoop】Hadoop MR异常处理
1.代码示例 package com.ares.hadoop.mr.flowsort; import java.io.IOException; import org.apache.hadoop.con ...