Redis源码分析系列七:initServer下

[亡魂溺海] 提交于 2019-11-29 03:40:32

这个函数快到尾声了,一鼓作气!

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多媒体服务器,敬请关注。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!