在Redis的protocol documentation它指出:Redis客户端如何实现流水线操作?
客户端可以使用,以发出多个 命令相同的连接。支持流水线操作,因此可以通过客户端的单个写入操作发送多个命令 ,因此不需要读取 服务器应答以发出下一个命令。所有回复 最后都可以阅读。
但是,我找不到任何这如何实际实施的例子。 Redis客户如何实现流水线?
在Redis的protocol documentation它指出:Redis客户端如何实现流水线操作?
客户端可以使用,以发出多个 命令相同的连接。支持流水线操作,因此可以通过客户端的单个写入操作发送多个命令 ,因此不需要读取 服务器应答以发出下一个命令。所有回复 最后都可以阅读。
但是,我找不到任何这如何实际实施的例子。 Redis客户如何实现流水线?
只要您可以轻松地在TCP流上分隔消息,服务器实际上不需要很多支持来支持流水线操作,TCP堆栈会为您缓冲数据,并且作为服务器,您可以读取/解析请求一个接一个,并在完成请求时发送回复。客户端/服务器只需要注意并处理这些缓冲区填满时的情况,以免发生死锁。
也就是说,对于redis来看看networking.c中的processInputBuffer()/ processMultibulkBuffer(),redis也有它自己的输出缓冲, addReply()
下面列出了一些关于Ruby redis客户端的源代码,redis-rb以及Python的redis-py之一。
他们基本上做什么TaylorOtwell如上所述,连击客户端将要进行的管道成一个单一的网络请求Redis的请求,而交易将使用Redis命令MULTI
/EXEC
开始和结束交易。
redis的-RB(从redis.rb和pipeline.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的客户端。希望有所帮助。
只是在上面的答案更多的见解。了解redis管道的一种方法是了解redis管道完全是客户端实现并且redis服务器与它无关的事实。虽然这在不同的客户端实现方式上有所不同,但这是一般化的想法:
流水线技术旨在解决高网络延迟环境中的响应延迟问题。因此,在发送命令和读取响应时在网络上花费的时间越少越好。这是通过缓冲有效实现的。在发送到服务器之前,客户端可能(或可能不)在TCP堆栈上缓冲命令(如其他答案中所述)。一旦它们被发送到服务器,服务器就执行它们并将它们缓存在服务器端。与客户端在收到响应后立即读取响应的情况不同,在流水线情况下,客户端从服务器端缓冲区读取响应,或者在应用程序执行“同步”(关闭管道)时读取响应。这是有利的,因为客户在阅读响应时花费在网络上的时间要少得多。
这里是我的博客上后,你可以参考以获得更好的主意: http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html