1. 程式人生 > >【redis】事件

【redis】事件

redis是單程序單執行緒的伺服器,在服務端是使用多路io複用技術實現的,也就是說是基於事件實現的。

redis分為兩種型別的事件,檔案時間和時間事件。

檔案事件:也就是傳統的io操作,基本分為連線,讀取,寫入和關閉。

不同的客戶端發來各種各樣的請求,redis的多路複用程式會把請求分解為不同的事件,然後將socket和事件一起打包放入佇列中,交給事件分離器處理,事件分離器會把各個事件交給對應的處理器處理。過程如下圖:


io多路複用程式會監聽不同的socket,只要有事件發生,就會打包放入佇列:


最後交給分離器去消費,可以看到這裡是順序執行的,這就是redis可以做分散式鎖的原因,分散式的程式最終會在redis這裡排隊。

下面看下redis檔案事件的處理器。主要有三類。

應答處理器,主要是對accept函式的封裝,監聽的事件型別是連線,一旦有連線發生,這個處理器就會建立一個套接字,並且在套接字上新增新的事件監聽和相應的處理器。

命令請求處理器,當客戶端呼叫了write以後,即傳送了命令過來,這時伺服器要讀取命令,對應的事件型別是read,是對底層套接字read函式的封裝,讀取命令,放入緩衝區中,讓後面的命令執行器執行相應的命令。

命令應答處理器,當客戶端執行了read等待伺服器返回結果時會觸發,對應的事件型別是write,是對底層套接字write函式的封裝,伺服器執行了客戶端的請求,這時就要返回結果。

所以,一次完整的redis請求為:


時間事件:

有兩類,一類是定時事件,只執行一次,另一類是週期事件,執行多次

時間事件的屬性有三個:id,when,handler

服務端會維護一個時間事件的列表,指標是time_events。


然後服務端有一個processTimeEvents函式,會週期性地遍歷這個時間事件列表,一旦需要執行,那麼就會執行該事件的處理函式,執行完以後,如果是週期事件,那麼就會更新事件的when,再次加入到列表裡,否則就扔出列表:


關於時間事件,redis內部有一個很重要的函式就是週期性執行的,serverCron函式,它會:


可以說它就是一個週期性時間事件的處理函式。