redis启动过程

Posted ginkgo-leaf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis启动过程相关的知识,希望对你有一定的参考价值。

一. 入口
int main(int argc, char **argv)

二. main()处理
1. server配制初始化
 //各种配制初始化
 void initServerConfig(void)
    //redis命令初始化, server.commands就是在这里初始化的
    populateCommandTable(void)

2. 加载配制
 //加载配制文件
 void loadServerConfig(char *filename, char *options)
    //加载配制上面方法生成的配制字符串
    loadServerConfigFromString(char *config)

3. server初始化
 void initServer(void)
    //通知消息静态数据初始化
    createSharedObjects()  
    //最大可打开文件设置
    adjustOpenFilesLimit()  
    //事件监听器
    server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
    //db内存初始化
       server.db = zmalloc(sizeof(redisDb)*server.dbnum);
    //tcp监听端口初始化            
    listenToPort(server.port,server.ipfd,&server.ipfd_count)
    server.sofd = anetUnixServer(server.neterr,server. server.unixsocketperm, server.tcp_backlog)
    db初始化:

  /* Create the Redis databases, and initialize other internal state. */
    for (j = 0; j < server.dbnum; j++) {
        server.db[j].dict = dictCreate(&dbDictType,NULL);
        server.db[j].expires = dictCreate(&keyptrDictType,NULL);
        server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);
        server.db[j].ready_keys = dictCreate(&setDictType,NULL);
        server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
        server.db[j].eviction_pool = evictionPoolAlloc();
        server.db[j].id = j;
        server.db[j].avg_ttl = 0;
    }

    
    计划任务和监听事件初始化:   

  /* Create the serverCron() time event, that‘s our main way to process
     * background operations. */
    if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) {
        serverPanic("Can‘t create the serverCron time event.");
        exit(1);
    }

    /* Create an event handler for accepting new connections in TCP and Unix
     * domain sockets. */
    for (j = 0; j < server.ipfd_count; j++) {
        if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,
            acceptTcpHandler,NULL) == AE_ERR)
            {
                serverPanic(
                    "Unrecoverable error creating server.ipfd file event.");
            }
    }
    if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
        acceptUnixHandler,NULL) == AE_ERR) serverPanic("Unrecoverable error creating server.sofd file event.");

 

4. 加载数据
 loadDataFromDisk()


5. server开启
 aeSetBeforeSleepProc(server.el,beforeSleep);
 //网络事件监听器启动
    aeMain(server.el);
    aeDeleteEventLoop(server.el);

 



































以上是关于redis启动过程的主要内容,如果未能解决你的问题,请参考以下文章

redis内部机制的介绍和启动过程

redis启动过程源码解析

从现有片段启动其他片段时应用程序崩溃

redis启动过程

深入Redis服务器启动过程

05.Redis服务的启停过程