Redis 2.8.9源碼 - ae模組

來源:互聯網
上載者:User

標籤:

本文為作者原創,轉載請註明出處:http://my.oschina.net/fuckphp/blog/505956

            Redis 的 ae模組的代碼主要分布在 ae.c ae.h 還有 ae_*.c 中,分別實現了epoll、evport、kqueue、select幾種網路模型,本文將以epoll為例,對Redis的ae模組進行學習。

Redis ae.c 事件模組筆記1.ae模組的核心結構aeEventLoop

aeEveltLoop 主要定義描述了redis ae模組的主迴圈資訊,在整個事件的重複持續時間內(aeEveltLoop.stop!=0),儲存了io事件和時間事件的事件列表等資訊。

typedef struct aeEventLoop {    int maxfd;   /* 當前註冊的最大描述符 */    int setsize; /* 最大檔案描述符個數 */    long long timeEventNextId;  //自增id 用於給每個事件分配id    time_t lastTime;     /* 用於校準系統時間,每次事件事件執行前更新該時間 */    aeFileEvent *events; /* 存放註冊的事件 */    aeFiredEvent *fired; /* 已經觸發的事件儲存在這裡 */    aeTimeEvent *timeEventHead; /* 時間事件單向鏈表 包含了未來將會事件的事件 */    int stop;    void *apidata; /* 使用者的自訂資料用於傳遞給回呼函數 */    aeBeforeSleepProc *beforesleep; /* 每一個事件迴圈都會執行一次 */} aeEventLoop;
aeFileEvent

aeFileEvent 描述了redis ae模組關於io類事件的主要資訊,包含當前事件的讀寫入模式回呼函數等,註冊一個io事件後aeFileEvent結構被記錄在aeEventLoop的events屬性中,根據檔案描述來決定結構在events屬性中的位置

/* File event structure */typedef struct aeFileEvent {    int mask; /* one of AE_(READABLE|WRITABLE) 讀寫入模式的定義*/    aeFileProc *rfileProc; /* 讀操作回呼函數的定義 */    aeFileProc *wfileProc; /* 寫操作回呼函數的定義 */    void *clientData; /* 使用者自訂資料用於傳遞給回呼函數 */} aeFileEvent;
aeTimeEvent

aeTimeEvent 描述了redis時間事件的主要資訊,Redis的事件事件結構就是一個鏈表節點,多個時間事件組成鏈表,Redis每個重複持續時間會遍曆該鏈表(儲存在aeEventLoop.timeEventHead中),進行時間校準後,執行觸發的時間事件。

/* Time event structure */typedef struct aeTimeEvent {    long long id; /* 時間事件的id,根據aeEventLoop.timeEventNextId屬性自增來產生 */    long when_sec; /* 執行當前事件的時間 單位 秒 */    long when_ms; /* 執行當前事件的時間 單位 毫秒 */    aeTimeProc *timeProc; /* 事件觸發時候執行 */    aeEventFinalizerProc *finalizerProc; /* 事件執行完成並且從時間事件鏈表中刪除的時候執行 */    void *clientData; /* 使用者自訂資料用於傳遞給回呼函數 */    struct aeTimeEvent *next; /* 指向鏈表的下一個節點 */} aeTimeEvent;
aeFiredEvent

aeFiredEvent 儲存了每次被觸發io事件的檔案描述符和讀寫入模式資訊

/* A fired event */typedef struct aeFiredEvent {    int fd;    /* 觸發io事件的檔案描述符 */    int mask; /* 描述當前觸發的讀寫入模式 */} aeFiredEvent;
2.ae模組核心結構之間的關係

該部分使用一張簡單的圖片來表示,具體內容可以結合上文注釋來理解(圖片偷自 @C_Z 的文章 :) )

3.ae模組執行主流程

建立 aeEventLoop同時初始化 io事件列表和事件事件鏈表和相關的狀態資訊,同時建立epoll對象

建立 時間事件 設定時間事件觸發的回呼函數,執行時間並加入到主迴圈的timeEventHead鏈表中

建立 io事件 根據 設定 epoll監聽的檔案表述符描述符讀寫狀態同時更新到aeEventLoop的events事件列表相應位置中(根據檔案描述符來定位指標的位移量)

主流流程執行

偷懶。。稍候補圖。。。。

執行 aeBeforeSleepProc 回呼函數

讀取最近一個時間事件的距離事件

執行epoll_wait 監聽檔案描述符,監聽逾時時間截止到下一個時間事件觸發之前或者有io事件觸發

將觸發的io事件放入aeEventLoop.FiredEvent中

讀取觸發的io事件列表並執行對應的讀寫事件

校準系統時間,如果系統時間與lastTime不符合實際情況,則將時間事件鏈表中所有事件都標記為立即執行

執行每一一個時間事件的回呼函數

根據回呼函數傳回值決定,當前事件該從時間事件鏈表刪除還是重新設定下次執行時間

如果時間事件從倆表刪除則執行 aeEventFinalizerProc 回呼函數

進入下一個重複持續時間 知道 aeEventLoop.stop == 0


Redis2.8.9源碼   src/ae.h   src/ae.c     src/ae_epoll.c

Redis 2.8.9源碼 - ae模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.