在Redis 协议文档中,它声明:
客户端可以使用相同的连接来发出多个命令。支持流水线,因此客户端可以使用单个写操作发送多个命令,不需要通过读取服务器应答来发出下一个命令。所有的答复都可以在结尾阅读。
但是,我找不到任何例子说明这是如何实际实现的。Redis客户端是如何实现流水线的?
发布于 2011-10-28 13:41:40
只要您可以轻松地在TCP流上分隔消息,服务器支持流水线的支持就不多了,TCP堆栈将为您缓冲数据,作为服务器,您只需逐个读取/解析请求,并在完成请求时发送回复。客户机/服务器只需要知道并在这些缓冲区填满时处理这些情况,而不是死锁。
尽管如此,对于redis来看一下networking.c中的processInputBuffer()/processMultibulkBuffer(),redis也有自己的输出缓冲,参见addReply()
发布于 2015-03-22 10:25:33
只是对上面的答案提出了更多的见解。理解redis管道的一种方法是理解redis管道完全是客户端实现,而redis服务器与此无关。虽然这在不同的客户端实现中有所不同,但以下是一个普遍的想法:
流水线是为了解决高网络延迟环境下的响应延迟问题。因此,在网络上发送命令和读取响应的时间越短,越好。这是通过缓冲有效实现的。在将命令发送到服务器之前,客户端可以(或不可能)在TCP堆栈(如其他答案中提到)缓冲这些命令。一旦它们被发送到服务器,服务器就会执行它们,并在服务器端缓冲它们。与通常的情况不同,客户端在接收到响应后立即读取响应,在流水线情况下,客户机将响应从服务器端缓冲区分部分读取,或者当应用程序执行“sync”(关闭管道)时读取响应。这是有利的,因为客户端在网络上读取响应的时间要短得多。
这是我博客上的一篇文章,你可以参考它来获得一个更好的想法:http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html
发布于 2011-12-05 20:14:21
下面分别列出了redis客户端redis-rb和Python的一个红皮的源代码中有几个很好的、简单的例子来说明如何实现这一点。
它们基本上完成了上面提到的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另一个很好的例子可以在Python客户端红皮的源代码中找到。希望这能有所帮助。
https://stackoverflow.com/questions/7929885
复制相似问题