事件 是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和...