周期分析struct结构体redis代码。最后,越多越发现很多的代码其实大同小异。于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下,最后决定先把简单的test包下的东西看看一下。毕竟结构体这块有点复杂。所以这次分析个简单点的。

test包下的文件并不多,代码量也非常少,总共5个文件:

1.memtest.c 内存检測
2.redis_benchmark.c 用于redis性能測试的实现。

3.redis_check_aof.c 用于更新日志检查的实现。
4.redis_check_dump.c 用于本地数据库检查的实现。
5.testhelp.c 一个C风格的小型測试框架。

今天讨论3和5,先看看5。testhelp.c被解释为一个C风格的小型測试框架。看见这标题,一定想到这是一个非常大的文件吧。都被称为測试框架了,事实上不然,我贴出整个代码:

/* 预处理 */
#ifndef __TESTHELP_H
#define __TESTHELP_H/* 開始时失败总数为0 */
int __failed_tests = 0;
/* 開始时測试总的样例数为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);#endif

调用形式也是极其简单:

 * test_cond("Check if 1 == 1", 1==1)* test_cond("Check if 5 > 10", 5 > 10)* test_report()

事实上就是宏定义了一个判别表达式真假的方法,又用到了函数式编程的思想,把_c整个表达式的值传入了还有一个函数中。就这么简单。

好,下一个文件redis_check_aof.c用于日志检測的,必定和文件的操作相关的,相同列出里面的API:

/* 方法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的非常多操作事实上都是非常类似的。我就举出当中的一个read方法当做样例。就是纯粹文件的简单操作,熟悉C语言的同学一定非常熟悉:

/* 从文件里读取long类型值 */
int readLong(FILE *fp, char prefix, long *target) {char buf[128], *eptr;//定位到文件的读取位置epos = ftello(fp);//将文件里的内容读取到buf中if (fgets(buf,sizeof(buf),fp) == NULL) {//假设为空直接返回return 0;}//假设读取到的首字符不等于预期值。则提示报错if (buf[0] != prefix) {ERROR("Expected prefix '%c', got: '%c'",buf[0],prefix);return 0;}//将字符串值转成long类型值*target = strtol(buf+1,&eptr,10);return consumeNewline(eptr);
}

里面有一个比較特别的方法,consumeNewline()消除换行符的方法:

/* 消除buf前面的换行符,即比較buf字符串中的前2个字符 */
int consumeNewline(char *buf) {if (strncmp(buf,"\r\n",2) != 0) {//假设不是等于"\r\n"。则提示出错ERROR("Expected \\r\\n, got: %02x%02x",buf[0],buf[1]);return 0;}return 1;
}

里面比較复杂的方法是off_t process(FILE *fp)获取文件偏移量的操作,这种方法是用来后面截断文件的操作,截断后面的空文件的部分:

off_t pos = process(fp);//截断文件的操作。从问价头部到后面的偏移量。没实用的空间截去if (ftruncate(fileno(fp), pos) == -1) {printf("Failed to truncate AOF\n");exit(1);} else {printf("Successfully truncated AOF\n");}

以上就是我所分析的内容了,很easy。比起struct比,简单太多了,能够细细体会当中方法涉及的技巧,比方我们会考虑日志文件分析时会想到用consumeNewline()更改设计线运行

版权声明:本文博主原创文章,博客,未经同意不得转载。

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

  1. redis源代码分析 – event library - Dicky - 开源中国社区

    redis源代码分析 – event library - Dicky - 开源中国社区 redis源代码分析 – event library

  2. Redis源代码分析(十一年)--- memtest内存测试

    今天,我们继续redis源代码test下测试在封装中的其它文件.今天读数memtest档,翻译了,那是,memory test 存储器测试工具..可是里面的提及了非常多东西,也给我涨了非常多见识,网上 ...

  3. Redis技术分析及应用 windows、linux安装最新redis

    标题 redis基础 windows下载地址 好像是第一次登录需要指定密码之后就记住了 linux下载地址 配置全局环境变量 下面且切记 已经启动不能关 另外开一个窗口 redis启动时的几个报警错误 ...

  4. Redis源代码分析-内存数据结构intset

    这次研究了一下intset.研究的过程中,一度看不下过去,可是还是咬牙挺过来了.看懂了也就是那么回事.静下心来,切莫浮躁 Redis为了追求高效,在存储下做了非常多的优化,像intset就是作者为了节 ...

  5. Redis源代码分析之sds, 动态数组

    Redis是用C语言编写的.C语言处理字符串一向是个难点.很容易出现内存越界问题. 其它高级语言很容易实现的字符串拼接,在C这里却是百般艰难.因为需要实现计算出字符串所占内存的大小.即不能过大(浪费内 ...

  6. STL 源代码分析 算法 stl_algo.h -- includes

    本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...

  7. redis性能分析工具redis-faina

    redis性能分析工具redis-faina redis-faina是一个通过解析redis的MONITOR命令,从而对redis实例进行性能诊断的工具. 该工具使用虽然简单,但是功能还是很不错,对于 ...

  8. Netty3 源代码分析 - NIO server绑定过程分析

    Netty3 源代码分析 - NIO server绑定过程分析      一个框架封装的越好,越利于我们高速的coding.可是却掩盖了非常多的细节和原理.可是源代码可以揭示一切. 服务器端代码在指定 ...

  9. PJzhang:漏洞渗透测试框架“天使之剑(AngelSword)”

    猫宁!!! 参考链接: www.phpinfo.cc/?post=42 https://www.freebuf.com/sectool/149883.html 同事介绍了一款渗透测试框架AngelSw ...

最新文章

  1. 重绘(repaint)与渲染(reflow)
  2. 跟着“路线图”,我们一起遨游机器学习的世界!
  3. js 检测浏览器,呈现引擎和平台
  4. android 读写文件权限_flutter 文件下载
  5. 智能指针shared_ptr的几个例子
  6. redis储存List类型数据
  7. spoj 2 Prime Generator
  8. HDU-3974 Assign the task 线段树 或 直接模拟多叉树 或 并查集 (三种方法)
  9. 省控线是什么意思,本科一批以及本科二批省控线是什么意思
  10. 偏差(bias)、方差(variance)和噪音(noise)
  11. Acrobat Pro DC 2021 for Mac(pdf编辑器)中文版
  12. Stack Overflow首席大神,他回答了超过3万个问题
  13. 阿里开源 10 年,这封信里也有 Flink 的身影。
  14. 我用 Python 抓取了 7000 多本电子书
  15. r型聚类分析怎么做_聚类分析原理及R语言实现过程
  16. 让优秀成为一种习惯——笔录
  17. java面试换背景颜色_开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?...
  18. Python中获取两数相除的商和余数
  19. 【Kotlin 初学者】字符串常用操作汇总
  20. 百练1041-反反复复-2016正式C题

热门文章

  1. python禁用键盘鼠标_在Python中禁用或锁定鼠标和键盘?
  2. Endless Spin
  3. 你有关注自己的简历吗?优秀的程序员简历是怎样炼成的?
  4. Java多线程之Runable与Thread
  5. 联发科芯片全线缺货:是OPPO太强还是英特尔抢产能
  6. POJ 2239 匈牙利算法
  7. [20160704]Block recover using RMAN.txt
  8. C++ 以智能指针管理内存资源
  9. 浅论 C++ 的复杂性
  10. DOS 常用命令大全