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函数。

累了,休息一会。

今天被公司副总任命为项目经理,继续加油,我的以为问题不大,技术的东西能有多难。

相关文章
相关标签/搜索