Redis如何處理每條指令的

事件模型

epoll

響應隊列

redis爲每個客戶端socket關聯了一個響應隊列,redis服務通過響應隊列來將指令的返回結果回覆給客戶端。如果隊列爲空,那麼意味着連接暫時處於空閒狀態,不需要去獲取寫事件,也就是可以將當前的客戶端描述符從write_fds裏移出來。等到隊列有數據了,再將描述符放進去,避免select系統調用立即返回寫事件,結果發現沒有數據,這樣會白白耗費CPU。

定時任務

redis服務器除了要響應客戶端的IO事件外,還需要處理其他事情,比如漸進式hash操作、持久化操作、過期刪除、主從同步等,這些任務都會存儲在一個最小堆中,在每個事件循環週期中,redis都會對最小堆堆頂的任務進行處理,並將執行下次任務的時間記錄下來,這個時間就是select系統調用的timeout函數。redis使用了epoll,所以將下次執行任務的時間作爲epoll_wait的timeout參數,在這時間之後沒有收到IO的任務就觸發定時任務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章