使用的是redis 3.2版本
test中的文件主要分为以下几个:

1.memtest.c 内存检测
2.redis_benchmark.c 用于redis性能测试的实现,后续会当做单独的一个章节进行分析
3.redis_check_aof.c 用于更新日志检查的实现。
4.redis_check_dump.c 用于本地数据库检查的实现。
5.testhelp.h 一个C风格的小型测试框架。
今天看了testhelp.h和redis_check_aof.c,主要将自己理解的写出来,要不然看了之后过一段时间又都忘记了,没有留下什么痕迹

testhelp.h一个C风格的小型测试框架:已经说是一个框架了,是不是代码量很多,其实就没几行代码,主要是里面的设计方式是值的学习的,就是函数式编程思想

// 失败的测试用例数量
int __failed_tests = 0;// 总的测试用例数量
int __test_num = 0;/* 宏定义测试方法,输入参数,输入描述语,判断的式子作为参数 */
/* 有完全体现了函数式编程的思想 */
#define test_cond(descr,_c) do { \__test_num++; printf("%d - %s: ", __test_num, descr); \if(_c) printf("PASSED\n"); else {printf("FAILED\n"); __failed_tests++;} \
} while(0);
#define test_report() do { \printf("%d tests, %d passed, %d failed\n", __test_num, \__test_num-__failed_tests, __failed_tests); \if (__failed_tests) { \printf("=== WARNING === We have failed tests here...\n"); \exit(1); \} \
} while(0);

例如,在sds的测试中的使用:

        sds x = sdsnew("foo"), y;test_cond("Create a string and obtain the length",sdslen(x) == 3 && memcmp(x,"foo\0",4) == 0)sdsfree(x);

只需要传入_c,就可以将具体的函数传入,是不是很精妙,实际上,这就是所说的函数式编程。

/* 方法API */
int consumeNewline(char *buf) /* 消除buf前面的换行符,即比较buf字符串中的前2个字符 */
int readLong(FILE *fp, char prefix, long *target) /* 从文件中读取long类型值 */
int readBytes(FILE *fp, char *target, long length) /* 从文件中读取字节 */
int readString(FILE *fp, char** target) /* 文件中读取字符串 */
int readArgc(FILE *fp, long *target) /* 文件中读取参数,首字符以“*”开头 */
off_t process(FILE *fp) /* 返回fp文件的偏移量 */

read方法大体类似,以下用readLong()作为例子:

// 从文件中读取long型数据
int readLong(FILE *fp, char prefix, long *target) {char buf[128], *eptr;// 定位到内容部分epos = ftello(fp);if (fgets(buf,sizeof(buf),fp) == NULL) {return 0;}// 前缀不符合预期if (buf[0] != prefix) {ERROR("Expected prefix '%c', got: '%c'",prefix,buf[0]);return 0;}// 转换为long型数据*target = strtol(buf+1,&eptr,10);return consumeNewline(eptr);
}

其中有一个比较特别的方法,consumeNewline()消除换行符的方法:

// 判断buf中前2个字符是否符合预期
int consumeNewline(char *buf) {if (strncmp(buf,"\r\n",2) != 0) {// 出错ERROR("Expected \\r\\n, got: %02x%02x",buf[0],buf[1]);return 0;}return 1;
}

相对于struct部分,该部分比较容易理解

Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测相关推荐

  1. Redis源码分析:基础概念介绍与启动概述

    Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...

  2. Redis源码分析(一)redis.c //redis-server.c

    Redis源码分析(一)redis.c //redis-server.c 入口函数 int main() 4450 int main(int argc, char **argv) {4451 init ...

  3. redis源码分析 -- cs结构之服务器

    服务器与客户端是如何交互的 redis客户端向服务器发送命令请求,服务器接收到客户端发送的命令请求之后,读取解析命令,并执行命令,同时将命令执行结果返回给客户端. 客户端与服务器交互的代码流程如下图所 ...

  4. 10年大厂程序员是如何高效学习使用redis的丨redis源码分析丨redis存储原理

    10年大厂程序员是怎么学习使用redis的 1. redis存储原理分析 2. redis源码学习分享 3. redis跳表和B+树详细对比分析 视频讲解如下,点击观看: 10年大厂程序员是如何高效学 ...

  5. Redis源码分析(一)--Redis结构解析

    从今天起,本人将会展开对Redis源码的学习,Redis的代码规模比较小,非常适合学习,是一份非常不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望最终能把他啃完吧,C语言好久 ...

  6. Redis 源码分析之故障转移

    在 Redis cluster 中故障转移是个很重要的功能,下面就从故障发现到故障转移整个流程做一下详细分析. 故障检测 PFAIL 标记 集群中每个节点都会定期向其他节点发送 PING 消息,以此来 ...

  7. Redis源码分析(零)学习路径笔记

    文章目录 第一阶段 第二阶段 熟悉Redis的内存编码结构 第三阶段 熟悉Redis数据类型的实现 第四阶段 熟悉Redis数据库的实现 第五阶段 熟悉客户端和服务器端的代码实现 第六阶段 这一阶段主 ...

  8. Redis源码分析之PSYNC同步

    Redis master-slave 同步源码分析 (1)slave 流程分析 (2)master 流程分析 Slave 分析 当Redis 启动后,会每隔 1s 调用 replicationCron ...

  9. Redis源码分析 —— 发布与订阅

    前言 通过阅读Redis源码,配合GDB和抓包等调试手段,分析Redis发布订阅的实现原理,思考相关问题. 源码版本:Redis 6.0.10 思考问题 发布订阅基本概念介绍 订阅频道 -- SUBS ...

最新文章

  1. php多表存储,php – MySql在一个单元格中存储另一个表的多个引用并选择它?
  2. 安卓学习第17课——Gallery
  3. Windows 2003 主域控和DNS迁移到Windows 2008 R2(2)
  4. Linux下rz命令和sz命令使用方法
  5. 【MySQL】 日 常 整 理 记 录 分 享
  6. Workaround for Search for my account in MyAppointment
  7. 需求简报_代码简报:NASA将所有研究成果发布为开放数据
  8. Linux系统的基本安装
  9. maven 打包部署时访问远程仓库中没有的jar
  10. UE3 基本的分析及优化技术
  11. jupyter notebook中matplotlib inline 关闭或打开
  12. 从ajax获取的数据无法通过Jquery选择器来调用事件
  13. jsp中使用jsp:include /在切换tomcat版本时遇到的问题
  14. [Unity]技巧分享:更改Unity Asset Store 默认下载资源位置的方法
  15. C#之放入透明背景字体(label标签的透明设置)
  16. 鉴源实验室丨汽车网络安全需求分析方法综述
  17. 随机森林的原理分析及Python代码实现
  18. 记录下我磕磕碰碰的三个月找工作经历,offer拿到手软
  19. java笔记之网络知识--—TCP
  20. 微信内浏览器或系统字体放大缩小,html页面布局错乱问题

热门文章

  1. 防止arp***方法
  2. ios之mknetworkkit笔记
  3. FireEye:2012年下半年高级威胁分析报告
  4. 谈判高手子贡---引导“用户”的专家
  5. laraval使用sqlite设置从多少开始递增
  6. 高性能MySQL之Count统计查询
  7. 进程同步与互斥的区别
  8. WSGI直观形象的了解一下
  9. python策略模式包含角色_详解Python设计模式之策略模式
  10. gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习