1. 程式人生 > >Redis伺服器如何傳送回覆內容給客戶端

Redis伺服器如何傳送回覆內容給客戶端

Redis採用了事件驅動框架,根據檔案事件及時間事件來處理邏輯。

讀事件的邏輯好理解:客戶端連線上伺服器後,伺服器呼叫accepttcphandle建立一個client,同時使用該client註冊一個將該fd的可讀事件與readQuery處理器繫結起來。當客戶端釋出命令後通過網路傳輸到redis-server後,核心向用戶空間丟擲可讀事件,readQuery被呼叫。

問題來了,readQuery執行後,可能會有需要返回給客戶端的資料,這個資料如何返回呢?即server如何傳送資料給客戶端。根據redis的設計,我原本以為redis-server註冊了一個可寫事件,再繫結一個類似於writeHandler之類的處理器來寫緩衝,看了原始碼,發現並不是這樣。

redis-server針對每個已經連線上的client維護了一個輸出緩衝,用於快取需要回復給client的內容。每次執行一個命令,如果產生了需要回復給客戶端的內容就呼叫AddReply*相關的介面寫到client的buf當中,然後在後續呼叫handleClientsWithPendingWrites()集中處理所有客戶端的回覆。在這個接口裡面實際執行了write來將buf當中的內容寫到網卡里,發給客戶端,中間呼叫的是writeToClient,這個函式持續寫資料,直到資料寫完。