九、Redis之流水線

shigp1發表於2024-10-19

Redis是一個使用客戶端-伺服器模型和所謂的請求/響應協議的TCP伺服器。

這意味著通常透過以下步驟完成請求:

  1. 客戶端向伺服器傳送查詢,並通常以阻塞方式從套接字讀取伺服器響應。
  2. 伺服器處理命令並將響應傳送回客戶端。

客戶端傳送請求到伺服器,伺服器處理請求並響應給客戶端。這個過程消耗的時間叫做RTT(往返時間)。如果要執行多個命令,客戶端每次都只傳送一個命令給redis伺服器執行,那麼總的RTT就很高。那有沒有解決方案讓RTT減少呢?那就是流水線。

Redis流水線是一種透過一次發出多個命令而不等待每個命令的響應來提高效能的技術。可以實現一個請求/響應伺服器,這樣即使客戶端還沒有讀取舊的響應,它也能夠處理新的請求。這樣,可以向伺服器傳送多個命令,而無需等待回覆,最後一步就可以讀取回復。

上圖中執行了三個命令,這三個命令只消耗了一個RTT。

流水線不僅僅是一種降低與往返時間相關的延遲成本的方法,它實際上大大提高了在給定的Redis伺服器中每秒可以執行的運算元量。這是因為如果不使用流水線,從訪問資料結構和生成回覆的角度來看,為每個命令提供服務非常便宜,但從進行套接字I/O的角度來看成本非常高。這涉及呼叫read()和write()系統呼叫,這意味著從使用者端到核心端。上下文切換是一個巨大的速度損失。

當使用流水線時,許多命令通常透過一個read()系統呼叫讀取,多個回覆透過一個write()系統呼叫傳遞。因此,每秒執行的總查詢數最初幾乎隨著管道的延長而線性增加,最終達到不使用管道獲得的基線的10倍,如圖所示。

相關文章