Redis开源代码读书笔记四(redis-server主程序, redis.c)

Redis工程代码从《Redis开源代码读书笔记二(源代码及工程结构) 》中可以看出,是非常出色的模块化代码。


因此,从敏捷的角度看,是非常易于阅读和增量开发的。由于琐碎时间的原因,这里将跟着自己的习惯,喜好等,一点一点的啃3.0.7代码。接下去将会从redis.c这份主程序代码来看下,主程序的整体大概是个什么情况,也便于着手后续的深入阅读。


主要全局变量

服务端众多的全局变量采用了C++类的方式进行了结构封装,程序结构更加清晰。


/* Global vars */
struct redisServer server; /* server global state */

/* Our shared "common" objects */
struct sharedObjectsStruct shared;


主要函数流程

main

 --> spt_init -- setproctitle.c
 --> zmalloc_enable_thread_safeness -- zmalloc.c
 --> zmalloc_set_oom_handler -- zmalloc.c
 --> dictSetHashFunctionSeed -- dict.c
 --> checkForSentinelMode /* check if the execute file is in sentinel mode */
 --> initServerConfig -- redis.c
 --> initSentinelConfig -- sentinel.c
 --> initSentinel -- sentinel.c
 --> [arg parse] /* if no arg use default config */
 --> daemonize /* fork, close std files and exit parent */
 --> initServer -- redis.c
 --> createPidFile /* record pid of the process in "/var/run/redis.pid" file */
 --> redisSetProcTitle /* change the name of process, and add cluster, sentinel or stand alone flag */
 --> redisAsciiArt /* log or printf redis ascii logo */
 --> checkTcpBacklogSettings /* check maximum TCP full accept numbers */
 --> loadDataFromDisk -- redis.c
 --> verifyClusterConfigWithData -- cluster.c
 --> , or sentinelIsRunning -- sentinel.c
 --> aeSetBeforeSleepProc -- ae.c
 --> aeMain -- ae.c
 --> aeDeleteEventLoop -- ae.c

loadDataFromDisk

 --> loadAppendOnlyFile -- aof.c
 --> rdbLoad -- rdb.c /* if error, exit*/

initServerConfig

/* server global state default update */
 --> getRandomHexChars -- util.c
 --> getLRUClock /* get clock for Least Recently Used algorithm */
  --> mstime
   --> ustime
    --> gettimeofday
 --> resetServerSaveParams -- config.c
 --> appendServerSaveParams -- config.c
 --> populateCommandTable -- /* Populates the Redis Command Table starting from the hard coded list*/
 --> [initialze struct redisServer server]

initServer

 --> setupSignalHandlers /* register sigShutdownHandler for exceptions */
 --> openlog /* syslog API, see syslog.h */
 --> createSharedObjects /* initialize struct sharedObjectsStruct shared */
 --> adjustOpenFilesLimit /* raise the max number of open files accordingly to the configured max number of clients. */
 --> aeCreateEventLoop -- ae.c
 --> listenToPort
  --> anetTcp6Server, anetTcpServer -- anet.c
 --> anetUnixServer -- anet.c
 --> anetNonBlock -- anet.c
 --> [Check socket listen state. there should be socket listening, or exit]
 --> [Create databases] dictCreate -- dict.c
 --> [Create databases] evictionPoolAlloc  /* Create a new eviction pool for LRU algorithm */
 --> [Create publish/subscribe channel] dictCreate, listCreate, listSetFreeMethod, listSetMatchMethod -- adlist.c
 --> aofRewriteBufferReset -- aof.c
 --> resetServerStats
 --> updateCachedTime
  --> time
  --> mstime
   --> ustime
    --> gettimeofday
 --> aeCreateTimeEvent -- ae.c
 --> [Create an event handler for accepting new connections] aeCreateFileEvent -- ae.c
 --> open /* Open the AOF file if needed */
 --> /* default 3 GB using maxmemory with 'noeviction' policy' */
 --> clusterInit -- cluster.c
 --> replicationScriptCacheInit -- replication.c
 --> scriptingInit -- script.c
 --> slowlogInit -- showlog.c
 --> latencyMonitorInit -- latency.c
 --> bioInit -- bio.c


文中符号意义

空格:表示上面函数的内部调用
-->:表示被调用的函数
<>:表示if
[]:被执行的代码段

--*.c:表示在哪个文件中实现,redis模块基本可以理解为按文件划分

你可能感兴趣的:(database)