首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis客户端是如何实现流水线的?

Redis客户端是如何实现流水线的?
EN

Stack Overflow用户
提问于 2011-10-28 13:25:05
回答 3查看 11.6K关注 0票数 10

在Redis 协议文档中,它声明:

客户端可以使用相同的连接来发出多个命令。支持流水线,因此客户端可以使用单个写操作发送多个命令,不需要通过读取服务器应答来发出下一个命令。所有的答复都可以在结尾阅读。

但是,我找不到任何例子说明这是如何实际实现的。Redis客户端是如何实现流水线的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-28 13:41:40

只要您可以轻松地在TCP流上分隔消息,服务器支持流水线的支持就不多了,TCP堆栈将为您缓冲数据,作为服务器,您只需逐个读取/解析请求,并在完成请求时发送回复。客户机/服务器只需要知道并在这些缓冲区填满时处理这些情况,而不是死锁。

尽管如此,对于redis来看一下networking.c中的processInputBuffer()/processMultibulkBuffer(),redis也有自己的输出缓冲,参见addReply()

票数 4
EN

Stack Overflow用户

发布于 2015-03-22 10:25:33

只是对上面的答案提出了更多的见解。理解redis管道的一种方法是理解redis管道完全是客户端实现,而redis服务器与此无关。虽然这在不同的客户端实现中有所不同,但以下是一个普遍的想法:

流水线是为了解决高网络延迟环境下的响应延迟问题。因此,在网络上发送命令和读取响应的时间越短,越好。这是通过缓冲有效实现的。在将命令发送到服务器之前,客户端可以(或不可能)在TCP堆栈(如其他答案中提到)缓冲这些命令。一旦它们被发送到服务器,服务器就会执行它们,并在服务器端缓冲它们。与通常的情况不同,客户端在接收到响应后立即读取响应,在流水线情况下,客户机将响应从服务器端缓冲区分部分读取,或者当应用程序执行“sync”(关闭管道)时读取响应。这是有利的,因为客户端在网络上读取响应的时间要短得多。

这是我博客上的一篇文章,你可以参考它来获得一个更好的想法:http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html

票数 6
EN

Stack Overflow用户

发布于 2011-12-05 20:14:21

下面分别列出了redis客户端redis-rb和Python的一个红皮的源代码中有几个很好的、简单的例子来说明如何实现这一点。

它们基本上完成了上面提到的TaylorOtwell,将客户端将向管道中的redis发出的请求连接到单个网络请求中,而事务则使用redis命令MULTI/EXEC来开始和结束事务。

redis-rb (来自redis.rbpipeline.rb):

代码语言:javascript
复制
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客户端红皮的源代码中找到。希望这能有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7929885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档