redis源码学习(一)
一、redis是什么?
redis可以看做是以socket做进程间通信的map,并封装多个接口及持久化机制。
二、学习路线
redis在3.0版本正式支持集群部署。在6.0版本加入多线程。这里选择从低版本开始按模块学习
1.Makefile文件
all: redis-server redis-benchmark redis-cli redis-check-dump
adlist.o: adlist.c adlist.h zmalloc.h
ae.o: ae.c ae.h zmalloc.h config.h ae_kqueue.c
ae_epoll.o: ae_epoll.c
ae_kqueue.o: ae_kqueue.c
ae_select.o: ae_select.c
anet.o: anet.c fmacros.h anet.h
dict.o: dict.c fmacros.h dict.h zmalloc.h
lzf_c.o: lzf_c.c lzfP.h
lzf_d.o: lzf_d.c lzfP.h
pqsort.o: pqsort.c
redis-benchmark.o: redis-benchmark.c fmacros.h ae.h anet.h sds.h adlist.h zmalloc.h
redis-cli.o: redis-cli.c fmacros.h anet.h sds.h adlist.h zmalloc.h
redis.o: redis.c fmacros.h config.h redis.h ae.h sds.h anet.h dict.h adlist.h zmalloc.h lzf.h pqsort.h zipmap.h staticsymbols.h
sds.o: sds.c sds.h zmalloc.h
zipmap.o: zipmap.c zmalloc.h
zmalloc.o: zmalloc.c config.h
all这里表示会生成4个可执行文件:
redis-server 服务端
redis-benchmark 性能测试工具
redis-cli redis客户端
redis-check-dump 检查dump.rdb文件
2.redis-cli
redis-cli.o: redis-cli.c fmacros.h anet.h sds.h adlist.h zmalloc.h
//客户端相关代码
//从main函数进来,定义的变量后面看,然后config结构体用来保存连接的服务端信息,先赋默认值
int firstarg;
char **argvcopy;
struct redisCommand *rc;
config.hostip = "127.0.0.1";
config.hostport = 6379;
config.repeat = 1;
config.dbnum = 0;
config.interactive = 0;
config.auth = NULL;
//第一个调用的函数,参数为命令行接收参数,返回值为参数个数,函数内部对参数识别并重新赋值给结构体config
firstarg = parseOptions(argc,argv);
static int parseOptions(int argc, char **argv) {
int i;
for (i = 1; i < argc; i++) {
int lastarg = i==argc-1;
//确认命令行接收参数是否规范,若不规范则调用usage输出规范参数形式
if (!strcmp(argv[i],"-h") && !lastarg) {
char *ip = zmalloc(32);
//anetResolve在anet.c中封装,调用inet_aton和gethostbyname来确定host是否有效,并把转换成字符串的ip写入第三个接收参数指向空间
if (anetResolve(NULL,argv[i+1],ip) == ANET_ERR) {
printf("Can't resolve %s\n", argv[i]);
exit(1);
}
config.hostip = ip;
i++;
} else if (!strcmp(argv[i],"-h") && lastarg) {
usage();
} else if (!strcmp(argv[i],"-p") && !lastarg) {
config.hostport = atoi(argv[i+1]);
i++;
} else if (!strcmp(argv[i],"-r") && !lastarg) {
config.repeat = strtoll(argv[i+1],NULL,10);
i++;
} else if (!strcmp(argv[i],"-n") && !lastarg) {
config.dbnum = atoi(argv[i+1]);
i++;
} else if (!strcmp(argv[i],"-a") && !lastarg) {
config.auth = argv[i+1];
i++;
} else if (!strcmp(argv[i],"-i")) {
config.interactive = 1;
} else {
break;
}
}
return i;
}
待续