找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4896|回复: 0

[原]Redis源代码分析之六:Redis执行流程

[复制链接]
发表于 2012-3-5 22:49:45 | 显示全部楼层 |阅读模式
现在我们分析Redis从启动开始的执行流程,从而顺藤摸瓜地理解其事件驱动模型。
首先找到main入口:
  1. int main(int argc, char **argv) {
  2.     time_t start;
  3.     initServerConfig();
  4.     if (argc == 2) {
  5.         if (strcmp(argv[1], "-v") == 0 ||
  6.             strcmp(argv[1], "--version") == 0) version();
  7.         if (strcmp(argv[1], "--help") == 0) usage();
  8.         resetServerSaveParams();
  9.         loadServerConfig(argv[1]);
  10.     } else if ((argc > 2)) {
  11.         usage();
  12.     } else {
  13.         redisLog(REDIS_WARNING,"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'");
  14.     }
  15.     if (server.daemonize) daemonize();
  16.     initServer();
  17.     if (server.daemonize) createPidFile();
  18.     redisLog(REDIS_NOTICE,"Server started, Redis version " REDIS_VERSION);
  19. #ifdef __linux__
  20.     linuxOvercommitMemoryWarning();
  21. #endif
  22.     start = time(NULL);
  23.     if (server.appendonly) {
  24.         if (loadAppendOnlyFile(server.appendfilename) == REDIS_OK)
  25.             redisLog(REDIS_NOTICE,"DB loaded from append only file: %ld seconds",time(NULL)-start);
  26.     } else {
  27.         if (rdbLoad(server.dbfilename) == REDIS_OK) {
  28.             redisLog(REDIS_NOTICE,"DB loaded from disk: %ld seconds",
  29.                 time(NULL)-start);
  30.         } else if (errno != ENOENT) {
  31.             redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting.");
  32.             exit(1);
  33.         }
  34.     }
  35.     if (server.ipfd > 0)
  36.         redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port);
  37.     if (server.sofd > 0)
  38.         redisLog(REDIS_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket);
  39.     aeSetBeforeSleepProc(server.el,beforeSleep);
  40.     aeMain(server.el);
  41.     aeDeleteEventLoop(server.el);
  42.     return 0;
  43. }
复制代码
我们看到,在initServer()中完成了初始化工作:
  1. void initServer() {
  2.     int j;
  3.     signal(SIGHUP, SIG_IGN);
  4.     signal(SIGPIPE, SIG_IGN);
  5.     setupSignalHandlers();
  6.     if (server.syslog_enabled) {
  7.         openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
  8.             server.syslog_facility);
  9.     }
  10.     server.mainthread = pthread_self();
  11.     server.clients = listCreate();
  12.     server.slaves = listCreate();
  13.     server.monitors = listCreate();
  14.     server.unblocked_clients = listCreate();
  15.     createSharedObjects();
  16.     server.el = aeCreateEventLoop();
  17.     server.db = zmalloc(sizeof(redisDb)*server.dbnum);
  18.     if (server.port != 0) {
  19.         server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr);
  20. …… …… ……
  21.     aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL);
  22.     if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE,
  23.         acceptTcpHandler,NULL) == AE_ERR) oom("creating file event");
  24.     if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
  25.         acceptUnixHandler,NULL) == AE_ERR) oom("creating file event");
  26.     if (server.appendonly) {
  27.         server.appendfd = open(server.appendfilename,O_WRONLY|O_APPEND|O_CREAT,0644);
  28.         if (server.appendfd == -1) {
  29.             redisLog(REDIS_WARNING, "Can't open the append-only file: %s",
  30.                 strerror(errno));
  31.             exit(1);
  32.         }
  33.     }
  34.     if (server.vm_enabled) vmInit();
  35.     slowlogInit();
  36.     bioInit();
  37.     srand(time(NULL)^getpid());
  38. }
复制代码
其中在redisServer结构体中定义了:

aeEventLoop *el;于是我们分析事件驱动模型,就可以从aeEventLoop入手,继续追随aeCreateTimeEvent函数和aeCreateFileEvent创建的事件是如何在事件驱动库下工作的。具体见下节。

作者:Aegeaner 发表于2012-2-27 14:09:40 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-2 10:57 , Processed in 0.021418 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表