1. 程式人生 > 資料庫 >Redis學習筆記:事件

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()

事件排程規則:

  1. aeApiPoll函式(也就是等待檔案事件產生那一步)的最大阻塞時間由到達時間最接近當前時間的時間事件決定
  2. 在沒到達時間事件之前,會一直處理檔案事件
  3. 對檔案事件和時間事件的處理都是同步、有序、原子地執行的,伺服器不會中途中斷事件處理,也不會對事件進行搶佔。

在看一個具體的例子:

開始時間結束時間動作
010建立一個在100毫秒到達的時間事件
1130等待檔案事件
3150處理檔案事件
5185等待檔案事件
85130處理檔案事件
131150執行 時間事件

上表中可以看出:

① 時間事件尚未到達時,伺服器是執行檔案事件,並處理了兩個。
② 因為處理事件的過程不會出現搶佔,所以實際處理時間事件的時間比預定的100毫秒慢了30毫秒