Redis-server启动做了哪些事?

228 阅读1分钟

源码版本6.0.6

1、server.c的main方法

a、设置了内存溢出的处理逻辑
zmalloc_set_oom_handler(redisOutOfMemoryHandler);
b、检查是否是哨兵模式启动
server.sentinel_mode = checkForSentinelMode(argc,argv);
c、初始化服务端的配置
initServerConfig();
d、初始化ACL子系统
ACLInit(); 
e、如果是哨兵模式,做的一些初始化
if (server.sentinel_mode) {
    initSentinelConfig();
    initSentinel();
}
f、初始化server
initServer();
包括:初始化一些默认的配置;
	创建共享对象;
    设置服务端能处理的最大的客户端数量;
	创建事件对象;
    初始化LRU keys池 evictionPoolAlloc();
g、InitServerLast();
h、从持久化文件加载数据
loadDataFromDisk();
i、其他
redisSetCpuAffinity(server.server_cpulist);
aeMain(server.el);
aeDeleteEventLoop(server.el);

2、作为一个单实例服务端启动的实际执行源码

int main(int argc, char **argv) {
  struct timeval tv;
  int j;
#ifdef INIT_SETPROCTITLE_REPLACEMENT
  spt_init(argc, argv);
#endif
  setlocale(LC_COLLATE,"");
  tzset(); 
  zmalloc_set_oom_handler(redisOutOfMemoryHandler);
  srand(time(NULL)^getpid());
  gettimeofday(&tv,NULL);
  crc64_init();
  uint8_t hashseed[16];
  getRandomBytes(hashseed,sizeof(hashseed));
  dictSetHashFunctionSeed(hashseed);
  server.sentinel_mode = checkForSentinelMode(argc,argv);
  initServerConfig();
  ACLInit(); 
  moduleInitModulesSystem();
  tlsInit();

  server.executable = getAbsolutePath(argv[0]);
  server.exec_argv = zmalloc(sizeof(char*)*(argc+1));
  server.exec_argv[argc] = NULL;
  for (j = 0; j < argc; j++) server.exec_argv[j] = zstrdup(argv[j]);

  server.supervised = redisIsSupervised(server.supervised_mode);
  int background = server.daemonize && !server.supervised;
  if (background) daemonize();

  initServer();
  if (background || server.pidfile) createPidFile();
  redisSetProcTitle(argv[0]);
  redisAsciiArt();
  checkTcpBacklogSettings();

  if (!server.sentinel_mode) {
  #ifdef __linux__
      linuxMemoryWarnings();
  #endif
      moduleLoadFromQueue();
      ACLLoadUsersAtStartup();
      InitServerLast();
      loadDataFromDisk();
      
      if (server.supervised_mode == SUPERVISED_SYSTEMD) {
          if (!server.masterhost) {
              redisCommunicateSystemd("STATUS=Ready to accept connections\n");
              redisCommunicateSystemd("READY=1\n");
          } else {
              redisCommunicateSystemd("STATUS=Waiting for MASTER <-> REPLICA sync\n");
          }
      }
  } 

  redisSetCpuAffinity(server.server_cpulist);
  aeMain(server.el);
  aeDeleteEventLoop(server.el);
  return 0;
}

3、初始化server又做了哪些事呢?