这个函数快到尾声了,一鼓作气!
if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR){
redisPanic("Can't create the serverCron time event.");
exit(1);
}
这个函数是创建时间事件。
这样的话,server->el的timeEventHead就链接了一个成员如下:
/* typedef struct aeTimeEvent {
long long id; / time event identifier.
// 0
long when_sec; / seconds /
// 2013-10-18
long when_ms; / milliseconds /
// 00:28. 其实是比当前时间多一毫秒
aeTimeProc *timeProc;
//serverCron
aeEventFinalizerProc *finalizerProc;
//NULL
void *clientData;
//null
struct aeTimeEvent *next;
} aeTimeEvent;
*/
~~~~~~~~~~~~~~~~~~~~
下面是依次循环执行aeCreateFileEvent函数
这个函数调用了aeApiAddEvent,这个函数主要关注:
if (epoll_ctl(state->epfd,op,fd,&ee) == -1) return -1;这个函数执行完,server->el->apidata的epfd就有了各个server socket handle,
显然后面会通过epoll_wait来监听事件。
再回到 aeCreateFileEvent
fe->mask |= mask;//设置readable标志
if (mask & AE_READABLE) fe->rfileProc = proc;//设置读的操作函数
if (mask & AE_WRITABLE) fe->wfileProc = proc;//这个不会执行
if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
acceptUnixHandler,NULL) == AE_ERR) redisPanic("Unrecoverable error creating server.sofd file event.");//这个不执行
/* Open the AOF file if needed. */
if (server.aof_state == REDIS_AOF_ON)
{
server.aof_fd = open(server.aof_filename,
O_WRONLY|O_APPEND|O_CREAT,0644);
if (server.aof_fd == -1)
{
redisLog(REDIS_WARNING, "Can't open the append-only file: %s",
strerror(errno));
exit(1);
}
}
//根据需要决定是否打开文件
if (server.arch_bits == 32 && server.maxmemory == 0){
redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.");
server.maxmemory = 3072LL*(1024*1024); /* 3 GB */
server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;
}
然后还剩下最后四个函数:
第一个函数:replicationScriptCacheInit();简单
第二个函数:scriptingInit();//这个是初始化LUA脚本,这个暂且忽略,后面在说明。
第三个函数: slowlogInit();简单,不解释。
第四个函数:bioInit();启动2个线程,暂时不研究,后续研究。
好累啊,去洗澡了,困!
PS:最近几天中断研究Redis,因项目需要,我需要花一个礼拜来研究Live555多媒体服务器,敬请关注。
来源:oschina
链接:https://my.oschina.net/u/1382024/blog/169724