pipline

zhengbiyu發表於2024-06-09

當您有批次操作、提高命令執行效能等需求時,您可以使用Redis管道傳輸(Pipeline,後面稱為Pipeline)機制。Pipeline可以將多個命令同時發給Redis服務端,減少網路延遲,並提高效能

Pipeline簡介

通常情況下,客戶端與Redis通訊時採用的是Ping-pong網路互動模式,Ping-pong模式是指客戶端(Client)傳送一個命令後會等待命令的執行結果,在客戶端收到伺服器端(Server)返回的結果後,再傳送下一個命令,以此類推。

Redis也支援Pipeline模式,不同於Ping-pong模式,Pipeline模式類似流水線的工作模式:客戶端傳送一個命令後無需等待執行結果,會繼續傳送其他命令;在全部請求傳送完畢後,客戶端關閉請求,開始接收響應,收到執行結果後再與之前傳送的命令按順序進行一一匹配。在Pipeline模式的具體實現中,大部分Redis客戶端採用批處理的方式,即一次傳送多個命令,在接收完所有命令執行結果後再返回給上層業務。

下圖為Ping-pong模式與Pipeline模式的網路通訊示意圖。

使用Pipeline可透過將多個命令打包到一起然後一次性傳送給 Redis 伺服器,降低網路往返時延(Round-trip time,簡稱RTT),減少read()write()的系統呼叫以及程序上下文切換次數,以提升程式的執行效率與效能。

Pipeline在某些場景下非常有效,例如有多個操作命令需要被迅速提交至伺服器端,但使用者並不依賴每個操作返回的響應結果,對結果響應也無需立即獲得,那麼Pipeline就可以用來作為最佳化效能的批處理工具。

重要

使用Pipeline時客戶端將獨佔與伺服器端的連線,此期間將不能進行其他“非Pipeline”型別操作,直至Pipeline被關閉;如果要同時執行其他操作,可以為Pipeline操作單獨建立一個連線,將其與常規操作分開。

注意事項

  • Pipeline不能保證原子性。

    Pipeline模式只是將客戶端傳送命令的方式改為傳送批次命令,而服務端在處理批次命令的資料流時,仍然是解析出多個單命令並按順序執行,各個命令相互獨立,即服務端仍有可能在該過程中執行其他客戶端的命令。如需保證原子性,請使用事務或Lua指令碼。

  • 若Pipeline執行過程中發生錯誤,不支援回滾。

    Pipeline沒有事務的特性,如待執行命令的前後存在依賴關係,請勿使用Pipeline。

  • Pipeline 每批打包的命令不能過多,因為 Pipeline 方式打包命令再傳送,那麼 Redis 必須在處理完所有命令前先快取起所有命令的處理結果。這樣就有一個記憶體的消耗,可以將大量命令拆分為多個小的Pipeline命令完成。