Redis源码分析系列五:initServer上

刚下班,吃了点饭,精神饱满,让我们继续分析initServer,这个函数还是很重要的。

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

    int j;



    signal(SIGHUP, SIG_IGN);//注册信号处理程序为忽略

    
    signal(SIGPIPE, SIG_IGN);//注册信号处理程序为忽略

下面是setupSignalHandlers();函数,看这个函数的代码,得知目的是:

为信号SIGTERM注册处理程序sigtermHandler

为信号SIGSEGV,SIGBUS,SIGFPE,SIGILL统一注册信号处理程序:sigsegvHandler

 

///////////////////////////////////////////////////////////////////////////////
    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();

上面这些代码都很简单,简单的初始化而已。

~~~~~~~~~~

下面来分析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函数。

累了,休息一会。

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


 

 

你可能感兴趣的:(redis,redis,qiangzigege,强子哥哥)