LOCKLOSE 发表于 2018-11-3 13:37:24

Redis 内存管理与事件处理

void initServer(void) {    int j;  
    // 设置信号对应的处理函数    signal(SIGHUP, SIG_IGN);
  
    signal(SIGPIPE, SIG_IGN);
  
    setupSignalHandlers();
  
    ...
  

  
    createSharedObjects();
  
    adjustOpenFilesLimit();    // 创建事件循环机制,及调用epoll_create创建epollfd用于事件监听
  
    server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
  
    server.db = zmalloc(sizeof(redisDb)*server.dbnum);
  
    /* Open the TCP listening socket for the user commands. */
  
    // 创建监听服务端口,socket/bind/listen
  
    if (server.port != 0 &&
  
      listenToPort(server.port,server.ipfd,&server.ipfd_count) == C_ERR)
  
      exit(1);
  
    ...
  
    /* Create the Redis databases, and initialize other internal state. */
  
    for (j = 0; j < server.dbnum; j++) {
  
      server.db.dict = dictCreate(&dbDictType,NULL);
  
      server.db.expires = dictCreate(&keyptrDictType,NULL);
  
      server.db.blocking_keys = dictCreate(&keylistDictType,NULL);
  
      server.db.ready_keys = dictCreate(&setDictType,NULL);
  
      server.db.watched_keys = dictCreate(&keylistDictType,NULL);
  
      server.db.eviction_pool = evictionPoolAlloc();
  
      server.db.id = j;
  
      server.db.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, AE_READABLE,
  
            acceptTcpHandler,NULL) == AE_ERR)
  
            {
  
                serverPanic(                  "Unrecoverable error creating server.ipfd file event.");
  
            }
  
    }    // 将事件加入到事件机制中,调用链为 aeCreateFileEvent/aeApiAddEvent/epoll_ctl
  
    if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
  
      acceptUnixHandler,NULL) == AE_ERR) serverPanic("Unrecoverable error creating server.sofd file event.");
  
    /* Open the AOF file if needed. */
  
    if (server.aof_state == AOF_ON) {
  
      server.aof_fd = open(server.aof_filename,
  
                               O_WRONLY|O_APPEND|O_CREAT,0644);      if (server.aof_fd == -1) {
  
            serverLog(LL_WARNING, "Can't open the append-only file: %s",
  
                strerror(errno));
  
            exit(1);
  
      }
  
    }
  

  
    ...
  
}


页: [1]
查看完整版本: Redis 内存管理与事件处理