從架構(gòu)圖及源碼分析redis單體服務(wù)架構(gòu)

文章目錄:
[TOC]

????本章從全局角度來看下redis服務(wù)設(shè)計(jì)的架構(gòu),從整體感官感受下redis 的各個(gè)數(shù)據(jù)結(jié)構(gòu)、線程模型等之間的關(guān)聯(lián)關(guān)系。希望整體的認(rèn)識能給我們后續(xù)的redis 細(xì)分模塊領(lǐng)域的學(xué)習(xí)做好鋪墊。
我們可以帶著問題去思考學(xué)習(xí):
1.redis 的服務(wù)性能為什么處理的快?
2.reids 的服務(wù)性能為什么可以支撐高并發(fā)?

先看下整體的模塊圖:


redis 架構(gòu)圖.png

1. 頂層域劃分:

首先大圖分為三個(gè)域: 客戶端、系統(tǒng)內(nèi)核域、redis域。
我們需要描述清楚三者之間的關(guān)系,客戶端是redisClient 發(fā)起的請求,屬于跨進(jìn)程的調(diào)用,redis域的 與客戶端通信交互 需要 依賴
操作系統(tǒng)內(nèi)核的 eventLoop 事件機(jī)制, 如此構(gòu)成了整體的大模塊的結(jié)構(gòu)。

2. redis 模塊劃分:

模塊 功能
1.ae模塊 負(fù)責(zé)網(wǎng)絡(luò)事件 IO多路復(fù)用的
2.bio模塊 負(fù)責(zé)后臺(tái)job 執(zhí)行
3.iothread多線程模塊 負(fù)責(zé)并發(fā)讀,并發(fā)寫
4.zmalloc內(nèi)存管理模塊 負(fù)責(zé)內(nèi)存管理
5.協(xié)議模塊 負(fù)責(zé)客戶端 和 服務(wù)端報(bào)文通信協(xié)議
6.DB模塊 數(shù)據(jù)存儲(chǔ)及命令執(zhí)行模塊
7.數(shù)據(jù)磁盤模塊 AOF、RDB
8. ACL權(quán)限模塊 訪問控制權(quán)限

3. redis 啟動(dòng)流程:(main 線程)

  1. 執(zhí)行啟動(dòng)命令: ./redis-server -選項(xiàng)
  2. 執(zhí)行.initServerConfig 函數(shù):
    2.1 構(gòu)造server單例,數(shù)據(jù)結(jié)構(gòu) server代表redis,里面包含了db,配置項(xiàng)等,所有和服務(wù)關(guān)聯(lián)的數(shù)據(jù)。
    2.2 掛載命令
    2.3 初始化配置,從配置文件及命令中;
  3. 執(zhí)行 initServer 函數(shù):
    3.1 分配客戶端列表
    3.2 分配讀寫等待隊(duì)列
    3.3 db 內(nèi)存分配
    3.4 創(chuàng)建redis共享對象
    3.5 createSocketAcceptHandler .aeCreateFileEvent 把新建接受鏈接的處理函數(shù)注冊到 el 上;
    3.6 設(shè)置 輪詢中的 睡眠 前后 執(zhí)行函數(shù)aeSetBeforeSleepProc(server.el,beforeSleep);
  4. InitServerLast 服務(wù)最后的初始化動(dòng)作;
    4.1 bioInit(); /// backgroud 后臺(tái)io 進(jìn)程初始化
    4.2 initThreadedIO(); // redis 引入的多線程
  5. loadDataFromDisk 從磁盤中加載redis 數(shù)據(jù)(AOF+RDB)
  6. mian.aeMain 事件循環(huán)函數(shù),進(jìn)入無限循環(huán)中執(zhí)行函數(shù) :aeProcessEvents
    6.1 eventLoop->beforesleep 休眠前執(zhí)行
    6.1.1 執(zhí)行并發(fā)讀
    6.1.2 執(zhí)行命令執(zhí)行
    6.1.3 執(zhí)行并發(fā)寫
    6.2 numevents = aeApiPoll(eventLoop, tvp); 如果沒有事件,可能導(dǎo)致休眠,直到超時(shí):
    6.3 eventLoop->aftersleep(eventLoop); 休眠后執(zhí)行函數(shù):暫無耗時(shí)操作;
    6.4 for 循環(huán)執(zhí)行 events 事件; 事件執(zhí)行 , 產(chǎn)生新的連接及讀事件。

4. eventLoop 機(jī)制:

這個(gè)是實(shí)現(xiàn)我么你常說的IO多路復(fù)用的功能,網(wǎng)絡(luò)事件(建立連接、收到數(shù)據(jù)、連接關(guān)閉) 會(huì)更新觸發(fā) eventLoop 產(chǎn)生對應(yīng)的事件。 事件注冊的時(shí)候,會(huì)把對應(yīng)的回調(diào)處理函數(shù)hook 也寫到 事件屬性里面。

這樣,在redis 域內(nèi),main 線程會(huì)不斷輪詢?nèi)ト?eventList ,然后調(diào)用event 關(guān)聯(lián)的proc,去處理回調(diào)。這里需要注意有哪些事件。
eventLoop的底層原理是 IO多路復(fù)用技術(shù), 編譯時(shí)會(huì)看執(zhí)行的平臺(tái),選擇不同平臺(tái)的 多路復(fù)用函數(shù)。

參考: IO多路復(fù)用實(shí)現(xiàn)方式 select, poll ,epoll :
https://blog.csdn.net/fengyuyeguirenenen/article/details/124234675

5. 事件類型

  1. 文件事件->監(jiān)聽的端口的新鏈接事件;其中建立連接后,把連接的fd 會(huì)注冊到 el上,當(dāng)文件有讀事件后,會(huì)觸發(fā) 2.
  2. 文件事件->socket 有數(shù)據(jù)可讀事件;
  3. 文件事件-> 連接關(guān)閉事件;
  4. 時(shí)間事件-> 輪詢?nèi)缓笈袛鄷r(shí)間間隔,判斷規(guī)則是否產(chǎn)生時(shí)間

6. redis 所有事件異步驅(qū)動(dòng)邏輯點(diǎn)

  1. 網(wǎng)絡(luò)事件: eventLoop 借助內(nèi)核 實(shí)現(xiàn)網(wǎng)絡(luò)事件的 異步及IO多路復(fù)用。
  2. 可讀、可寫客戶端隊(duì)列: 準(zhǔn)備好的客戶端都排在隊(duì)列里面;
  3. 并發(fā)讀寫時(shí)間:讀寫隊(duì)列執(zhí)行前,main 線程會(huì)把任務(wù)分派給每個(gè)線程來執(zhí)行;
  4. 時(shí)間事件: AOF 異步寫等;
  5. 后臺(tái)事件: 發(fā)送到對應(yīng)類型job 的實(shí)踐隊(duì)列中;

實(shí)現(xiàn)的方式:數(shù)據(jù)結(jié)構(gòu)分割數(shù)據(jù),多線程根據(jù)數(shù)據(jù)及鎖、標(biāo)識寫作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容