2011-10-28 67 views
5

在Redis的protocol documentation它指出:Redis客戶端如何實現流水線操作?

客戶端可以使用,以發出多個 命令相同的連接。支持流水線操作,因此可以通過客戶端的單個寫入操作發送多個命令 ,因此不需要讀取 服務器應答以發出下一個命令。所有回覆 最後都可以閱讀。

但是,我找不到任何這如何實際實施的例子。 Redis客戶如何實現流水線?

回答

4

只要您可以輕鬆地在TCP流上分隔消息,服務器實際上不需要很多支持來支持流水線操作,TCP堆棧會爲您緩衝數據,並且作爲服務器,您可以讀取/解析請求一個接一個,並在完成請求時發送回覆。客戶端/服務器只需要注意並處理這些緩衝區填滿時的情況,以免發生死鎖。

也就是說,對於redis來看看networking.c中的processInputBuffer()/ processMultibulkBuffer(),redis也有它自己的輸出緩衝, addReply()

4

下面列出了一些關於Ruby redis客戶端的源代碼,redis-rb以及Python的redis-py之一。

他們基本上做什麼TaylorOtwell如上所述,連擊客戶端將要進行的管道成一個單一的網絡請求Redis的請求,而交易將使用Redis命令MULTI/EXEC開始和結束交易。

redis的-RB(從redis.rbpipeline.rb):

def pipelined(options = {}) 
    synchronize do 
    begin 
     original, @client = @client, Pipeline.new 
     yield 
     if @client.commands.empty? 
     [] 
     else 
     original.call_pipelined(@client.commands, options) 
     end 
    ensure 
     @client = original 
    end 
    end 
end 

def call_pipelined(commands, options = {}) 
    @commands.concat commands 
    nil 
end 

另一個很好的例子可以在源中找到redis-py,一個Python redis的客戶端。希望有所幫助。

2

只是在上面的答案更多的見解。瞭解redis管道的一種方法是瞭解redis管道完全是客戶端實現並且redis服務器與它無關的事實。雖然這在不同的客戶端實現方式上有所不同,但這是一般化的想法:

流水線技術旨在解決高網絡延遲環境中的響應延遲問題。因此,在發送命令和讀取響應時在網絡上花費的時間越少越好。這是通過緩衝有效實現的。在發送到服務器之前,客戶端可能(或可能不)在TCP堆棧上緩衝命令(如其他答案中所述)。一旦它們被髮送到服務器,服務器就執行它們並將它們緩存在服務器端。與客戶端在收到響應後立即讀取響應的情況不同,在流水線情況下,客戶端從服務器端緩衝區讀取響應,或者在應用程序執行「同步」(關閉管道)時讀取響應。這是有利的,因爲客戶在閱讀響應時花費在網絡上的時間要少得多。

這裏是我的博客上後,你可以參考以獲得更好的主意: http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html