天天看點

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

作者:福大大架構師每日一題

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

答案2023-06-03:

Redis用戶端執行一條指令通常包括以下四個階段:

1.發送指令:用戶端将要執行的指令發送到Redis伺服器。

2.指令排隊:Redis伺服器将收到的指令放入隊列中,按照先進先出(FIFO)的原則等待執行。

3.指令執行:當Redis伺服器輪到該指令時,執行該指令并傳回結果。在執行期間,Redis伺服器可能會讀取或修改資料庫中的資料,或者執行其他操作。

4.傳回結果:Redis伺服器将結果傳回給用戶端,用戶端可以使用該結果進行後續的操作。

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

image.png

其中,第1步和第4步所需的時間被稱為往返時間(Round Trip Time,RTT),即指資料在網絡上傳輸的來回時間。

Redis提供了批量操作指令(例如 mget、mset 等),這些指令允許用戶端一次發送多個指令或資料,并且将結果一次性傳回給用戶端,有效地節約了往返時間(RTT)。

但是需要注意的是,雖然 Redis 提供了批量操作指令,但并不是所有指令都支援批量操作。例如,如果需要執行 n 次 hgetall 指令,因為沒有 mhgetall 指令等價于 MGET 指令,是以需要執行 n 次單獨的 hgetall 指令,這将會消耗 n 次 RTT。

舉例:Redis的用戶端和服務端可能部署在不同的機器上。例如用戶端在本地,Redis伺服器在阿裡雲的廣州,兩地直線距離約為800公裡,那麼1次RTT時間=800 x2/ ( 300000×2/3 ) =8毫秒,(光在真空中傳輸速度為每秒30萬公裡,這裡假設光纖為光速的2/3 )。而Redis指令真正執行的時間通常在微秒(1000微妙=1毫秒)級别,是以才會有Redis 性能瓶頸是網絡這樣的說法。

為了解決這種需要頻繁與 Redis 伺服器通信的問題,Redis 提供了 Pipeline(流水線)機制。Pipeline 可以将一組 Redis 指令進行組裝,在一次 RTT 中将它們發送給 Redis,再将這組 Redis 指令的執行結果按順序傳回給用戶端。相比于單獨執行每個指令并每個指令都需要一次 RTT 的方式,使用 Pipeline 可以大幅減少網絡延遲的數量。沒有使用Pipeline執行了n條指令,整個過程需要n次RTT。

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

image.png

使用Pipeline 執行了n次指令,整個過程隻需要1次RTT。

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

image.png

Pipeline 并不是一個新的技術或機制,而是一種已經被廣泛使用的技術。在其他技術中,例如資料庫、消息隊列和分布式系統等領域,也有類似的機制用于減少網絡延遲。

此外,在不同的網絡環境下,往返時間(RTT)可能會有所不同。例如,在同一資料中心内的機器之間進行通信時,由于網絡延遲較低,RTT 時間通常會更快。而當兩個機器在不同的地理位置且距離較遠時,RTT 時間可能會更長。

Redis 指令行用戶端 redis-cli 的 --pipe 選項實際上就是使用 Pipeline 機制,允許使用者一次性發送多個 Redis 指令,并一次性接收多個指令的傳回結果。這樣可以有效地減少網絡延遲數量,并提高 Redis 的性能和可靠性。

但在大多數情況下,我們更傾向于使用 Java 語言的 Redis 用戶端中的 Pipeline。這是因為 Java 用戶端可以很友善地內建到應用程式的代碼中,并且提供了更多的功能和靈活性。例如,Java 用戶端通常支援異步操作、連接配接池管理、失敗重試等特性,可以幫助開發者輕松地建構高性能的 Redis 應用程式。

總的來說,在不同網絡環境下非Pipeline和Pipeline執行10000次set操作的效果,在執行時間上的比對如下:

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

image.png

差距有100多倍。在不同網絡環境下,執行 10000 次 set 操作時,使用 Pipeline 和逐條執行的速度差異可能會非常大。例如,在網絡延時較大的情況下,Pipeline 的效果尤為明顯。據此可以得到如下兩個結論:

1.使用 Pipeline 執行多個 Redis 指令,通常比逐條執行要快。這是因為 Pipeline 可以将多個指令一次性發送給 Redis 伺服器,并一次性接收多個指令的傳回結果,進而減少了網絡傳輸和等待時間,提高了 Redis 的性能和響應速度。

2.用戶端和服務端之間的網絡延遲越大,Pipeline 的優勢越明顯。這是因為在網絡延遲較大的情況下,每個指令執行完成後需要等待很長時間才能執行下一個指令。而使用 Pipeline,用戶端可以将多個指令一次性發送給 Redis 伺服器,并一次性接收多個指令的傳回結果,進而減少了等待時間,提高了 Redis 的性能和可靠性。

2023-06-03:redis中pipeline有什麼好處,為什麼要用 pipeline?

福大大架構師每日一題java當死,golang當立。最新面試題,涉及golang,rust,mysql,redis,雲原生,算法,分布式,網絡,作業系統。541篇原創内容

公衆号

繼續閱讀