您的位置:首页 > 数据库 > Redis

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

2016-03-19 17:22 549 查看
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

--> <sentinel_mode> initSentinelConfig -- sentinel.c

--> <sentinel_mode> initSentinel -- sentinel.c

--> [arg parse] /* if no arg use default config */

--> <daemonize> daemonize /* fork, close std files and exit parent */

--> initServer -- redis.c

--> <daemonize> 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 */

--> <sentinel_mode> loadDataFromDisk -- redis.c

--> <sentinel_mode> <cluster_enabled> verifyClusterConfigWithData -- cluster.c

--> <sentinel_mode> , or sentinelIsRunning -- sentinel.c

--> aeSetBeforeSleepProc -- ae.c

--> aeMain -- ae.c

--> aeDeleteEventLoop -- ae.c

loadDataFromDisk

--> <REDIS_AOF_ON> loadAppendOnlyFile -- aof.c

--> <REDIS_AOF_OFF, REDIS_AOF_WAIT_REWRITE> 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 */

--> <syslog_enabled> 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

--> <TCP socket> listenToPort

--> anetTcp6Server, anetTcpServer -- anet.c

--> <Unix socket> anetUnixServer -- anet.c

--> <Unix socket> 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

--> <REDIS_AOF_ON> open /* Open the AOF file if needed */

--> <maxmemory_policy> /* default 3 GB using maxmemory with 'noeviction' policy' */

--> <cluster_enabled> clusterInit -- cluster.c

--> replicationScriptCacheInit -- replication.c

--> scriptingInit -- script.c

--> slowlogInit -- showlog.c

--> latencyMonitorInit -- latency.c

--> bioInit -- bio.c

文中符号意义

空格:表示上面函数的内部调用

-->:表示被调用的函数

<>:表示if

[]:被执行的代码段

--*.c:表示在哪个文件中实现,redis模块基本可以理解为按文件划分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: