Redis源碼分析系列七:initServer下

這個函數快到尾聲了,一氣呵成! redis

if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR)
 {
        redisPanic("Can't create the serverCron time event.");
        exit(1);
    }

這個函數是建立時間事件。 api

這樣的話,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;
   */ app

 

~~~~~~~~~~~~~~~~~~~~ socket

下面是依次循環執行aeCreateFileEvent函數 ide

這個函數調用了aeApiAddEvent,這個函數主要關注: 函數

 if (epoll_ctl(state->epfd,op,fd,&ee) == -1) return -1;

這個函數執行完,server->el->apidata的epfd就有了各個server socket handle, 線程

顯而後面會經過epoll_wait來監聽事件。 server

再回到 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多媒體服務器,敬請關注。

相關文章
相關標籤/搜索