Redis源碼分析系列五:initServer上

剛下班,吃了點飯,精神飽滿,讓咱們繼續分析initServer,這個函數仍是很重要的。 redis

~~~~~~~~~~~~~~~~~~ api

    int j; ide



    signal(SIGHUP, SIG_IGN);//註冊信號處理程序爲忽略

    
    signal(SIGPIPE, SIG_IGN);//註冊信號處理程序爲忽略 函數

下面是setupSignalHandlers();函數,看這個函數的代碼,得知目的是: oop

爲信號SIGTERM註冊處理程序sigtermHandler spa

爲信號SIGSEGV,SIGBUS,SIGFPE,SIGILL統一註冊信號處理程序:sigsegvHandler server

 

///////////////////////////////////////////////////////////////////////////////
    if (server.syslog_enabled)
 {
        openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
            server.syslog_facility);
    }
 //默認不執行
  對象

    server.current_client = NULL;//設置current_client--->NULL

    
    server.clients = listCreate();
 //初始化clients

 
    server.clients_to_close = listCreate();

 
    server.slaves = listCreate();

 
    server.monitors = listCreate();

 
    server.slaveseldb = -1; /* Force to emit the first SELECT command. */

 
    server.unblocked_clients = listCreate();

 
    server.ready_keys = listCreate(); ip

上面這些代碼都很簡單,簡單的初始化而已。 ci

~~~~~~~~~~

下面來分析createSharedObjects函數

能夠看到用到了函數createObject,只不過參數不同而已,

那咱們就看看createObject產生的對象的模板是什麼樣的!

通過分析,模板以下:

typedef struct redisObject
{
    unsigned type:4;
 //type,由參數決定
 
    unsigned notused:2;     /* Not used */
    unsigned encoding:4;
 ///REDIS_ENCODING_RAW
 
    unsigned lru:22;        /* lru time (relative to server.lruclock) */
 // server.lruclock,此時爲 0
 
    int refcount;
 // 1
 
    void *ptr;
 //由參數決定
} robj;

那麼就能夠相應的改變type和ptr就能夠了。

那麼剩下的就好說了,這裏不贅述。

adjustOpenFilesLimit();
 //調整最大文件打開的數目

~~~~~~~~~~~~~~~~~~~~~

下面是aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);

讓咱們看下這個函數的執行結果

typedef struct aeEventLoop
{
    int maxfd;   /* highest file descriptor currently registered */
     // -1
 
    int setsize; /* max number of file descriptors tracked */
  // ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )
 
    long long timeEventNextId;
   // 0
 
    time_t lastTime;     /* Used to detect system clock skew */
   //2013-10-17 22:56,我看時的時間是這個
 
    aeFileEvent *events; /* Registered events */
 //( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )  *  sizeof(aeFileEvent)
 //且每一個event.mask = AE_NONE
 
    aeFiredEvent *fired; /* Fired events */
   // ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )  *  sizeof(aeFiredEvent)
 
    aeTimeEvent *timeEventHead;
    // NULL
 
    int stop;
   // 0
 
    void *apidata; /* This is used for polling API specific data */
    /*
     typedef struct aeApiState {
         int epfd;
         // epoll_create(1024);
   
      struct epoll_event *events;
      // ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )  *  sizeof(epoll_event)
  
       } aeApiState;
   */


    aeBeforeSleepProc *beforesleep;
    // null
 
} aeEventLoop;

其中epfd很重要,使用epoll_create API來建立,這個相信你們都不陌生。

備註:我喜歡用epoll,因此這裏我看的是epoll函數。

累了,休息一會。

今天被公司副總任命爲項目經理,繼續加油,我的以爲問題不大,技術的東西能有多難。

相關文章
相關標籤/搜索