如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Redis源代码分析一直有打算写篇关于redis源代码分析的文章,一直很忙,还好最近公司终于闲了一点,总算有点时间学习了,于是终于可以兑现承诺了,废话就到此吧,开始我们的源代码分析,在文章的开头我们把所有服务端文件列出来,并且标示出其作用:adlist.c//双向链表ae.c//事件驱动ae_epoll.c//epoll接口,linux用ae_kqueue.c//kqueue接口,freebsd用ae_select.c//select接口,windows用anet.c//网络处理aof.c//处理AOF文件config.c//配置文件解析db.c//DB处理dict.c//hash表intset.c//转换为数字类型数据multi.c//事务,多条命令一起打包处理networking.c//读取、解析和处理客户端命令object.c//各种对像的创建与销毁,string、list、set、zset、hashrdb.c//redis数据文件处理redis.c//程序主要文件replication.c//数据同步master-slavesds.c//字符串处理sort.c//用于list、set、zset排序t_hash.c//hash类型处理t_list.c//list类型处理t_set.c//set类型处理t_string.c//string类型处理t_zset.c//zset类型处理ziplist.c//节省内存方式的list处理zipmap.c//节省内存方式的hash处理zmalloc.c//内存管理上面基本是redis最主要的处理文件,部分没有列出来,如VM之类的,就不在这里讲了。首先我们来回顾一下redis的一些基本知识:1、redis有N个DB(默认为16个DB),并且每个db有一个hash表负责存放key,同一个DB不能有相同的KEY,但是不同的DB可以相同的KEY;2、支持的几种数据类型:string、hash、list、set、zset;3、redis可以使用aof来保存写操作日志(也可以使用快照方式保存数据文件)对于数据类型在这里简单的介绍一下(网上有图,下面我贴上图片可能更容易理解)1、对于一个string对像,直接存储内容;2、对于一个hash对像,当成员数量少于512的时候使用zipmap(一种很省内存的方式实现hashtable),反之使用hash表(key存储成员名,value存储成员数据);3、对于一个list对像,当成员数量少于512的时候使用ziplist(一种很省内存的方式实现list),反之使用双向链表(list);4、对于一个set对像,使用hash表(key存储数据,内容为空)5、对于一个zset对像,使用跳表(skiplist),关于跳表的相关内容可以查看本blog的跳表学习笔记;下面正式进入源代码的分析1、首先是初始化配置,initServerConfig(redis.c:759)voidinitServerConfig(){server.port=REDIS_SERVERPORT;server.bindaddr=NULL;server.unixsocket=NULL;server.ipfd=-1;server.sofd=-1;2.在初始化配置中调用了populateCommandTable(redis.c:925)函数,该函数的目地是将命令集分布到一个hashtable中,大家可以看到每一个命令都对应一个处理函数,因为redis支持的命令集还是蛮多,所以如果要靠if分支来做命令处理的话即繁琐效率还底,因此放到hashtable中,在理想的情况下只需一次就能定位命令的处理函数。voidpopulateCommandTable(void){intj;intnumcommands=sizeof(readonlyCommandTable)/sizeof(structredisCommand);for(j=0;j<numcommands;j++){structredisCommand*c=readonlyCommandTable+j;intretval;retval=dictAdd(server.commands,sdsnew(c->name),c);assert(retval==DICT_OK);}}3、对参数的解析,redis-server有一个参数(可以不需要),这个参数是指定配置文件路径,然后由函数loadServerConfig(config.c:28)加载所有配置if(argc==2){if(strcmp(argv[1],“-v”)==0||strcmp(argv[1],“–version”)==0)version();if(strcmp(argv[1