在Redis 协议文档中,它指出:
客户端可以使用相同的连接来发出多个命令.支持流水线操作,因此客户端可以通过单个写入操作发送多个命令,不需要读取服务器回复以发出下一个命令.所有的回复都可以在最后阅读.
但是,我找不到任何实际实现方式的示例.Redis客户端如何实现流水线操作?
有关如何实现它的一些好的,简单的示例可以在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
Run Code Online (Sandbox Code Playgroud)
另一个很好的例子可以在redis-py的源代码中找到,它是一个Python redis客户端.希望有所帮助.
只是对上述答案提出更多见解。理解redis管道的一种方法是理解redis管道完全是一个客户端实现,redis服务器与它无关。虽然这在不同的客户端实现中有所不同,但这是一个通用的想法:
流水线旨在解决高网络延迟环境中的响应延迟问题。因此,通过网络发送命令和读取响应所花费的时间越少越好。这可以通过缓冲有效地实现。在将命令发送到服务器之前,客户端可能(或可能不)在 TCP 堆栈中缓冲命令(如其他答案中所述)。一旦它们被发送到服务器,服务器就会执行它们并在服务器端缓冲它们。与客户端在收到响应后立即读取响应的通常情况不同,在流水线的情况下,客户端从服务器端缓冲区部分读取响应,或者在应用程序执行“同步”(关闭管道)时读取响应。这是有利的,因为客户端在网络上读取响应所花费的时间要少得多。
这是我博客上的一篇文章,您可以参考以获得更好的主意:http : //nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html
只要您可以轻松地划分TCP流上的消息,服务器实际上只需要很少的支持来支持流水线操作,TCP堆栈将为您缓冲数据,作为服务器,您只需逐个读取/解析请求即可.一,并在完成请求后发回回复.客户端/服务器只需要知道并处理这些缓冲区填满的情况,以防止死锁.
也就是说,对于redis来看看network.c中的processInputBuffer()/ processMultibulkBuffer(),redis也有自己的输出缓冲,参见例如addReply()
| 归档时间: |
|
| 查看次数: |
7129 次 |
| 最近记录: |