2011-10-28 30 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