1. 程式人生 > 實用技巧 >Redis-Pipeline

Redis-Pipeline

https://segmentfault.com/a/1190000011440752

Pipeline

1. Pipeline概念

Redis客戶端執行一條命令分為以下四個步驟:

1.傳送命令
2.命令排隊
3.命令執行
4.返回結果

其中,第一步+第四步稱為Round Trip Time(RTT,往返時間).

  Redis提供了批量操作命令(例如mget,mset等),有效的節約RTT.但大部分命令是不支援批量操作的,例如要執行nhgetall命令,並沒有mhgetall存在,需要消耗nRTT.

  Pipeline機制能改善上面這類問題,它能將一組Redis命令進行組裝,通過一次RTT傳輸給Redis

,再將這組Redis命令按照順序執行並裝填結果返回給客戶端.圖1.1中未使用Pipeline執行了n次命令,整個過程需要n個RTT.

2. 原生批量命令與Pipeline對比

可以使用Pipeline模擬出批量操作的效果,但是在使用時需要質疑它與原生批量命令的區別,具體包含幾點:

  • 原生批量命令是原子性,Pipeline是非原子性的.
  • 原生批量命令是一個命令對應多個key,Pipeline支援多個命令.
  • 原生批量命令是Redis服務端支援實現的,而Pipeline需要服務端與客戶端的共同實現.

3. Pipeline缺點

  Pipeline雖然好用,但是每次Pipeline組裝的命令個數不能沒有節制,否則一次組裝Pipeline

資料量過大,一方面會增加客戶端的等待時機,另一方面會造成一定的網路阻塞,可以將一次包含大量命令的Pipeline拆分成多次較小的Pipeline來完成.

  Pipeline只能操作一個Redis例項,但即使在分散式Redis場景中,也可以作為批量操作的重要優化方法.

4. 事務

  Redis提供了簡單的功能,將一組需要一起執行的命令放到multiexec兩個命令之間.multi命令代表事務的開始,exec命令代表事務結束,他們之間的命令是原子順序執行的.在exec命令執行之前,中間命令並沒有真正執行,而是暫且儲存到Redis中。

  Redis根據命令的不同錯誤有不同的處理機制:

4.1 命令錯誤

  比如語法錯誤,寫錯命令單詞了,會造成整個事務無法執行,redis資料未發生改變。

4.2 執行時錯誤

  此時不支援回滾功能,需要開發者自己修改此類問題。