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双向链表相关推荐

  1. redis源码阅读-zset

    前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解.(ps: 分享的文章再丰富下再放出来). 数据结构 我们先看下redis 5.0的代码.本次讲解主要是zs ...

  2. redis源码阅读-持久化之RDB

    持久化介绍: redis的持久化有两种方式: rdb :可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) aof : 记录redis执行的所有写操作命令 根 ...

  3. redis源码阅读-持久化之aof与aof重写详解

    aof相关配置 aof-rewrite-incremental-fsync yes # aof 开关,默认是关闭的,改为yes表示开启 appendonly no # aof的文件名,默认 appen ...

  4. redis 源码阅读

    双向链表(adlist.h/adlist.c) - redis 源码解析 1.0 documentation (redissrc.readthedocs.io) 如何阅读 Redis 源码? - bl ...

  5. redis源码阅读(1)

    redis 是c 编写的,首先看下redis 代码目录结构(对应版本3.25): 开发相关的放在deps下面: 主要代码放置在deps和src下面,utils 下面放置的是rb 脚本 首先看下src ...

  6. Redis源码阅读,从入门到放弃

    作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...

  7. Redis源码阅读01-读了一下redis启动流程涉及的源码我都读了个啥

    阅读源码是学习一门技术的必经之路,经过1周左右的c语言入门学习,我就开始硬读redis的源码了.因为公司的多版本的改造,所以源码就选择redis6.x的最高版本redis6.2.7. 在阅读源码前,首 ...

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

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

  9. redis源码阅读--hashTable

    为什么80%的码农都做不了架构师?>>>    公司有个项目用到hash,同事从redis的代码里抠了hashTable的源码出来,最近抽空看了一下,设计还是很精妙的. 现在把阅读的 ...

最新文章

  1. pytorch模型转onnx-量化rknn(bisenet)
  2. 福禄克OFP光纤测试仪5个强大的功能
  3. 关于单纤与双纤光端机的区别介绍
  4. 20165221 JAVA第四周学习心得
  5. Oracle常用函数笔记
  6. 关于word的格式规范
  7. 移动HS8545M光猫密码
  8. 桌面排版神器:Affinity Publisher for Mac
  9. 上传图片,使用很简单的办法上传图片
  10. 对微软winsock PC端开发蓝牙疑问
  11. cad化工设备绘图_化工CAD制图基础篇,管道布置图学起来
  12. intel dpdk api rte_eal_hpet_init() 函数介绍
  13. 【open3d】安装open3d.whl之后,import报错ModuleNotFoundError: No module named ‘open3d.cpu‘
  14. Flink学习:WaterMark
  15. forEach和$.each()以及$().each()的用法
  16. 江南计算机研究所招聘物联网学院,江南大学:物联网工程学院培育物联网精英人才...
  17. 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)
  18. 拥有谷歌100万股原始股,奥尼尔每年能够得到多少分红?
  19. 如何从0搭建Speedtest服务器
  20. javaSE commons-io第三方插件, FileUtils工具类,复制文件夹、文件,写入/读取文件

热门文章

  1. 一双木棋chess[九省联考2018]
  2. 模拟退火算法从原理到实战【基础篇】
  3. Bootstrap栅格系统(布局)
  4. MapReduce InputFormat之FileInputFormat
  5. IP地址子网的划分机制
  6. 计算区域中有t 个点的 区域有多少个+计算几何 + 叉乘+sort+ 二分 + map poj 2398 Toy Storage...
  7. 几种SQL取日期部分的方法
  8. MySQL执行计划extra中的using index 和 using where using index 的区别
  9. qs.js 更好的处理url参数
  10. Android——build.prop 解析