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
转载于:https://www.cnblogs.com/stonehat/p/4855680.html
Redis源码阅读-Adlist双向链表相关推荐
- redis源码阅读-zset
前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解.(ps: 分享的文章再丰富下再放出来). 数据结构 我们先看下redis 5.0的代码.本次讲解主要是zs ...
- redis源码阅读-持久化之RDB
持久化介绍: redis的持久化有两种方式: rdb :可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) aof : 记录redis执行的所有写操作命令 根 ...
- redis源码阅读-持久化之aof与aof重写详解
aof相关配置 aof-rewrite-incremental-fsync yes # aof 开关,默认是关闭的,改为yes表示开启 appendonly no # aof的文件名,默认 appen ...
- redis 源码阅读
双向链表(adlist.h/adlist.c) - redis 源码解析 1.0 documentation (redissrc.readthedocs.io) 如何阅读 Redis 源码? - bl ...
- redis源码阅读(1)
redis 是c 编写的,首先看下redis 代码目录结构(对应版本3.25): 开发相关的放在deps下面: 主要代码放置在deps和src下面,utils 下面放置的是rb 脚本 首先看下src ...
- Redis源码阅读,从入门到放弃
作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...
- Redis源码阅读01-读了一下redis启动流程涉及的源码我都读了个啥
阅读源码是学习一门技术的必经之路,经过1周左右的c语言入门学习,我就开始硬读redis的源码了.因为公司的多版本的改造,所以源码就选择redis6.x的最高版本redis6.2.7. 在阅读源码前,首 ...
- Redis源码阅读笔记(1)——简单动态字符串sds实现原理
首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...
- redis源码阅读--hashTable
为什么80%的码农都做不了架构师?>>> 公司有个项目用到hash,同事从redis的代码里抠了hashTable的源码出来,最近抽空看了一下,设计还是很精妙的. 现在把阅读的 ...
最新文章
- pytorch模型转onnx-量化rknn(bisenet)
- 福禄克OFP光纤测试仪5个强大的功能
- 关于单纤与双纤光端机的区别介绍
- 20165221 JAVA第四周学习心得
- Oracle常用函数笔记
- 关于word的格式规范
- 移动HS8545M光猫密码
- 桌面排版神器:Affinity Publisher for Mac
- 上传图片,使用很简单的办法上传图片
- 对微软winsock PC端开发蓝牙疑问
- cad化工设备绘图_化工CAD制图基础篇,管道布置图学起来
- intel dpdk api rte_eal_hpet_init() 函数介绍
- 【open3d】安装open3d.whl之后,import报错ModuleNotFoundError: No module named ‘open3d.cpu‘
- Flink学习:WaterMark
- forEach和$.each()以及$().each()的用法
- 江南计算机研究所招聘物联网学院,江南大学:物联网工程学院培育物联网精英人才...
- 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)
- 拥有谷歌100万股原始股,奥尼尔每年能够得到多少分红?
- 如何从0搭建Speedtest服务器
- javaSE commons-io第三方插件, FileUtils工具类,复制文件夹、文件,写入/读取文件
热门文章
- 一双木棋chess[九省联考2018]
- 模拟退火算法从原理到实战【基础篇】
- Bootstrap栅格系统(布局)
- MapReduce InputFormat之FileInputFormat
- IP地址子网的划分机制
- 计算区域中有t 个点的 区域有多少个+计算几何 + 叉乘+sort+ 二分 + map poj 2398 Toy Storage...
- 几种SQL取日期部分的方法
- MySQL执行计划extra中的using index 和 using where using index 的区别
- qs.js 更好的处理url参数
- Android——build.prop 解析