对于redis底层框架的理解(一)
近期學習了redis底層框架,好多東西之前都沒聽說過,算是大開眼界了。
?
先梳理下redis正常的通訊流程吧
?
首先服務器啟動都有主函數main,這個main函數就在redis.c里
首先是initserverconfig(),在這里初始化了redisserver基本的配置信息,
接著調用loadServerConfig(char *filename) 對 server 全局變量重新初始化。
然后是調用daemonize(),實現守護進程,脫離了控制臺,是這個進程
成為獨立的首領進程
接下來是initServer(),這個過程很重要,完成了事件驅動的注冊和一些
回調函數的綁定,回頭仔細說這個函數里面的功能
初始化服務器過后aeSetBeforeSleepProc(),設置了服務器休眠之前會
調用beforeSleep函數
然后進入主要的事件輪詢函數?aeMain(server.el),在這里完成事件的派發
最后事件輪詢過后我們調用aeDeleteEventLoop,釋放之前開辟的內存,
結束進程。
中間略去一些瑣碎的過程,我們總結一下
initserverconfig() ----> loadServerConfig------> daemonize()
initServer()-----> aeSetBeforeSleepProc()------>aeMain()----->
aeDeleteEventLoop
?
接下來詳細說一下每一個步驟都做了什么。
?
看一下main()函數
int main(int argc, char **argv) {
? ?????
????//設置時間,一般都是設置事件poll等待多長時間返回
?????struct timeval tv;
?
? ? /* We need to initialize our libraries, and the server configuration. */
????#ifdef INIT_SETPROCTITLE_REPLACEMENT
????????//進程重命名
? ? ????spt_init(argc, argv);
????#endif
? ?//好像是更改字符編碼
? ? setlocale(LC_COLLATE,"");
????//設置多線程安全模式
? ? zmalloc_enable_thread_safeness();
????//注冊內存使用過量報錯的函數
? ? zmalloc_set_oom_handler(redisOutOfMemoryHandler);
? ? srand(time(NULL)^getpid());
? ? gettimeofday(&tv,NULL);
????//哈希種子
? ? dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
????//服務器的啟動模式:單機模式、Cluster模式、sentinel模式
? ? server.sentinel_mode = checkForSentinelMode(argc,argv);
? ? initServerConfig();
????loadServerConfig(configfile,options);
????。。。
?
????
???????????//創建守護進程
? ????????? if (server.daemonize) daemonize();
????????????//初始化服務器
????????????initServer();
????????????//設置服務器sleep之前的函數調用
????????????aeSetBeforeSleepProc(server.el,beforeSleep);
????????????//主函數事件驅動
? ????????? aeMain(server.el);
????????????//刪除事件循環的結構,釋放空間
? ? ????????aeDeleteEventLoop(server.el);
? ????????? return 0;
}
總結
以上是生活随笔為你收集整理的对于redis底层框架的理解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器内核
- 下一篇: 终端报错xcrun: error: un