日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对于redis底层框架的理解(一)

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对于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底层框架的理解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。