源码版本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又做了哪些事呢?