Redis學習筆記:事件
環境
window10
前言
《Redis 設計與實現》讀書筆記;
事件
Redis伺服器是一個事件驅動程式;
主要有兩類:
① 檔案事件:Redis專門用來處理網路通訊操作的封裝;Redis伺服器通過套接字與客戶端進行連線,而檔案事件就是伺服器對套接字操作的抽象。
② 時間事件:Redis伺服器中的一些操作需要在給定的時間點執行,而時間事件就是伺服器對這類定時操作的抽象。
檔案事件
檔案事件分為AE_READABLE
事件(讀事件)和AE_WRITABLE
事件(寫事件)兩類。
我們想來看下檔案事件一個完整的連線過程:
大致的流程:
Redis伺服器啟動後,那麼這個伺服器的監聽套接字的AE_READABLE
① 客戶端發起伺服器連線,觸發連線應答處理器
的執行。
② 處理器做出連線應答後,會建立客戶端套接字、客戶端狀態,並將客戶端套接字的AE_READABLE
事件與命令請求處理器進行關聯。
③ 客戶端傳送命令請求,觸發命令請求處理器
執行;
④ 執行完畢後,會產生相應的命令回覆,觸發命令回覆處理器
。
時間事件
分為兩種:
① 定時事件:在指定的時間之後執行一次。比如,讓程式在當前時間的30毫秒之後執行一次。
② 週期性事件:每隔指定時間就執行一次。
時間事件主要由以下三個屬性組成:
① Id
:全域性唯一標識。ID號從小到大順序遞增。
② when
③
timeProc
: 時間事件處理器,一個函式。當時間事件到達時,伺服器就會呼叫相應的處理器來處理事件。
serverCron函式
這個可以說是時間事件的週期性執行的一個具體應用;
Redis伺服器利用該函式對自身的資源和狀態進行檢查和調整;
主要工作:
① 更新伺服器的各類統計訊息,比如:時間、記憶體佔用、資料庫佔用等。
② 清理資料庫中的過期鍵值對。
③ 關閉和清理連線失效的客戶端。
④ 嘗試進行AOF或RDB持久化操作。
⑤ 如果伺服器是主伺服器,那麼對從伺服器進行定期同步。
⑥ 如果處於叢集模式,對叢集進行定期同步和連線測試。
事件的排程
因為同時存在檔案事件和時間事件兩種事件型別。那麼伺服器是如何排程的呢?
上述流程的虛擬碼:
def main():
# 初始化伺服器
init_server()
# 一直處理事件,直到伺服器關閉
while server_is_not_shutdown():
aeProcessEvents()
# 伺服器關閉,執行清理操作
clean_server()
事件排程規則:
aeApiPoll
函式(也就是等待檔案事件產生
那一步)的最大阻塞時間由到達時間最接近當前時間的時間事件決定- 在沒到達時間事件之前,會一直處理檔案事件
- 對檔案事件和時間事件的處理都是同步、有序、原子地執行的,伺服器不會中途中斷事件處理,也不會對事件進行搶佔。
在看一個具體的例子:
開始時間 | 結束時間 | 動作 |
---|---|---|
0 | 10 | 建立一個在100毫秒到達的時間事件 |
11 | 30 | 等待檔案事件 |
31 | 50 | 處理檔案事件 |
51 | 85 | 等待檔案事件 |
85 | 130 | 處理檔案事件 |
131 | 150 | 執行 時間事件 |
上表中可以看出:
① 時間事件尚未到達時,伺服器是執行檔案事件,並處理了兩個。
② 因為處理事件的過程不會出現搶佔,所以實際處理時間事件的時間比預定的100毫秒慢了30毫秒