Redis原始碼分析(二十) 事件ae

2021-06-26 17:58:45 字數 2030 閱讀 7170

事件 是redis伺服器的核心,處理兩項任務:檔案事件和時間事件。在redis的事件處理中,用到了epoll,select,kqueue和evport等事件模型(在對應的.c檔案中)。

處理檔案事件: 

在多個客戶端中實現多路復用,客戶端通過套接字與伺服器連線,伺服器接受它們發來的命令請求(讀事件),執行,然後將命令執行結果返回給客戶端(寫事件)。

讀事件

當乙個新的客戶端連線到伺服器時,伺服器就給該客戶端繫結讀事件,直到客戶端斷開連線,這個讀事件才會被移除。

讀事件 等待:客戶端無命令到達。

讀事件 就緒:客戶端命令到達,且可無阻塞讀取。

寫事件:

只有當伺服器處理完客戶端命令請求,且需要將結果返回客戶端時,才會給客戶端繫結寫事件,在寫入完成後寫事件即移除。

寫事件 等待:有命令結果需要返回,但客戶端阻塞

寫事件 就緒:命令結果可以無阻塞寫入客戶端。

注:當檔案讀寫事件同時到達時,先執行讀事件。

檔案事件結構:

typedef struct aefileevent  aefileevent;
時間事件:實現伺服器的常規操作。定期對伺服器自身資源和狀態進行必要的檢查和處  理,從而讓server維持在穩健狀態。由伺服器設定的,在指定時間需要執行的事件即servercron job,多個時間事件時間以無序鍊錶存放在伺服器狀態中。通過遍歷鍊錶,並檢視是時間事件的when屬性,確實該事件是否已經需要執行,且根據其處理函式timeproc的返回值確定是否為需要迴圈執行的事件。

目前redis中只有乙個時間事件:servercron,乙個定期迴圈事件,直到伺服器關閉。

時間事件結構:

主要的三個屬性:

when:

在什麼時候執行事件處理函式的時間戳。

timeproc:

事件處理函式

next:

指向下乙個時間事件,組成鍊錶

typedef struct aetimeevent  aetimeevent;
事件處理器的狀態:

typedef struct aeeventloop  aeeventloop;
redis事件處理的核心部分即事件的執行與排程:

在redis中,兩種事件為合作關係:

1、在一種事件執行完畢之後才開始執行另一事件,不搶占執行。

2、當兩種事件同時達到時,先檔案事件,再時間事件。

3、檔案事件的等待時間由到達時間最短的時間事件決定(即檔案事件一直等待,如果直到下乙個時間事件達到時還未就緒,則執行時間事件)

整個事件處理程式過程:

將以上事件處理函式放入乙個迴圈中,加上初始化以及清理函式,就構成了redis的主函式呼叫:

def redis_mian():

#初始化伺服器

init_server()

#一直處理事件,直到伺服器關閉

while server_is_not_shutdown():

process_event()

#清理伺服器

clenn_server()

事件處理器的主迴圈:

void aemain(aeeventloop *eventloop) 

}

可見redis的事件處理和排程整體思路還是很簡單的,但是其中的很多內容正是後續需要學習的,fighting!

Redis原始碼分析 intset h c

intset.h c 是redis 的整數set實現,intset的結構體如下 基本結構 typedef struct intset intset intset的第乙個成員encoding,表明contents中的儲存資料的資料長度,可以是16bits,32bits,64bits。第二個成員leng...

Redis原始碼分析系列

redis目前熱門nosql記憶體資料庫,量不是很大,本系列是本人閱讀redis原始碼時記錄的筆記,由於時間倉促和水平有限,文中難免會有錯誤之處,歡迎讀者指出,共同學習進步,本文使用的redis版本是2.8.19。redis之hash資料結構 redis之intset資料結構 redis之skipl...

redis原始碼分析 adlist

typedef struct listnode listnode 首先定義了乙個節點,包含前驅和後繼以及對應的value typedef struct listiter listiter list的迭代器,next指標和迭代方向 typedef struct list list 鍊錶內容 head和...