当前位置:网站首页>Redis入門完整教程:Pipeline

Redis入門完整教程:Pipeline

2022-07-04 22:52:00 穀哥學術

3.3.1 Pipeline概念
Redis客戶端執行一條命令分為如下四個過程:
1)發送命令
2)命令排隊
3)命令執行
4)返回結果
其中1)+4)稱為Round Trip Time(RTT,往返時間)。
Redis提供了批量操作命令(例如mget、mset等),有效地節約RTT。但
大部分命令是不支持批量操作的,例如要執行n次hgetall命令,並沒有
mhgetall命令存在,需要消耗n次RTT。Redis的客戶端和服務端可能部署在不
同的機器上。例如客戶端在北京,Redis服務端在上海,兩地直線距離約為
1300公裏,那麼1次RTT時間=1300×2/(300000×2/3)=13毫秒(光在真空中
傳輸速度為每秒30萬公裏,這裏假設光纖為光速的2/3),那麼客戶端在1秒
內大約只能執行80次左右的命令,這個和Redis的高並發高吞吐特性背道而
馳。
Pipeline(流水線)機制能改善上面這類問題,它能將一組Redis命令進
行組裝,通過一次RTT傳輸給Redis,再將這組Redis命令的執行結果按順序
返回給客戶端,圖3-5為沒有使用Pipeline執行了n條命令,整個過程需要n次
RTT。

 圖3-6為使用Pipeline執行了n次命令,整個過程需要1次RTT。
Pipeline並不是什麼新的技術或機制,很多技術上都使用過。而且RTT
在不同網絡環境下會有不同,例如同機房和同機器會比較快,跨機房跨地區
會比較慢。Redis命令真正執行的時間通常在微秒級別,所以才會有Redis性
能瓶頸是網絡這樣的說法。
redis-cli的--pipe選項實際上就是使用Pipeline機制,例如下面操作將set
hello world和incr counter兩條命令組裝:
echo -en '*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n*2\r\n$4\r\nincr\r\
n$7\r\ncounter\r\n' | redis-cli --pipe

但大部分開發人員更傾向於使用高級語言客戶端中的Pipeline,目前大
部分Redis客戶端都支持Pipeline,第4章我們將介紹如何通過Java的Redis客
戶端Jedis使用Pipeline功能。

3.3.2 性能測試
錶3-1給出了在不同網絡環境下非Pipeline和Pipeline執行10000次set操作
的效果,可以得到如下兩個結論:
·Pipeline執行速度一般比逐條執行要快。
·客戶端和服務端的網絡延時越大,Pipeline的效果越明顯。

因測試環境不同可能得到的具體數字不盡相同,本測試Pipeline每次攜
帶100條命令。

 3.3.3 原生批量命令與Pipeline對比
可以使用Pipeline模擬出批量操作的效果,但是在使用時要注意它與原
生批量命令的區別,具體包含以下幾點:
·原生批量命令是原子的,Pipeline是非原子的。
·原生批量命令是一個命令對應多個key,Pipeline支持多個命令。
·原生批量命令是Redis服務端支持實現的,而Pipeline需要服務端和客戶
端的共同實現。

3.3.4 最佳實踐
Pipeline雖然好用,但是每次Pipeline組裝的命令個數不能沒有節制,否
則一次組裝Pipeline數據量過大,一方面會增加客戶端的等待時間,另一方
面會造成一定的網絡阻塞,可以將一次包含大量命令的Pipeline拆分成多次
較小的Pipeline來完成。
Pipeline只能操作一個Redis實例,但是即使在分布式Redis場景中,也可
以作為批量操作的重要優化手段,具體細節見第11章。

原网站

版权声明
本文为[穀哥學術]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207042229263590.html