Redis 事件模型

基礎知識(瞭解):事件驅動、reactor、I/O多路複用,或者NIOjava

事件類型:IO事件、時間事件,其中時間事件分爲按期事件和週期事件(截止redis2.8,只有週期事件,且只有一個:serverCron事件)react

一般redis的時間事件只有一個,serverCron事件:按期對自身的資源和狀態進行查檢調整,任務redis

  • 更新服務器的各種統計信息,如時間、內存佔用、數據庫佔用狀況等
  • 清理數據庫中過時鍵值對
  • 關閉和清理鏈接失效的客戶端
  • 嘗試進行AOF或RDB持久化操做
  • 主服務器,按期對從服務器進行同步
  • 集羣模式下,按期對集羣進行同步和鏈接測試
  • 2.6,每秒支行10次
  • 2.8,hz選項調整每秒執行次數

事件調度:數據庫

  • redis服務器啓動,完成初始化後,進入事件循環
  • 獲取並計算最近的時間事件,獲得獲取IO事件時的阻塞時間,負數則置0
  • 在上一步計算得出的阻塞時間(可有爲零)內,獲取全部IO事件,並執行處理函數
  • 調用時間事件處理器:獲取全部到達的時間事件,執行處理函數
  • 結束本次循環,進入下一次

由以上事件調度模型可知,redis的時間事件老是發生在IO事件以後(除非一直沒有IO事件發生),而IO事件是隨機事件,且執行時間並不精確,所以 時間事件的執行時間也不精確,且一般晚於預計時間服務器

事件循環僞代碼:函數

public void main(String[] args){
	redisServerInit();
	while(!stop){
		redisEventLoopHandler();
	}
}
// 一個事件循環過程
static void redisEventLoopHandler(){
	// 獲取最新的時間事件,並計算距離當前時間的爲毫秒數
	long remaind = computeLatestEventTime();
	// 若是小於等於0,說明事件執行時間已到達,置爲0
	if (remaind <= 0){
		remaind = 0;
	}
	// 阻塞獲取全部發生的IO事件
	IOEvent[] events = aeApiPoll(remaind);
	for(IOEvent event : events){
		processIOEvents(event);
	}
	// 處理全部到達的時間事件(截止2.8,其實就一個serverCron事件)
	processTimeEvents();
}
相關文章
相關標籤/搜索