6

我对 Redis 事务和管道之间的区别以及最终如何将管道与 Booksleeve 一起使用有点混淆。我看到Booksleeve支持 Redis事务功能( MULTI/ EXEC),但在其 API/测试中没有提及流水线功能。然而,在其他实现中很明显管道和事务之间存在区别,即原子性,正如下面的 redis-ruby 版本所证明的那样,但在某些地方,这些术语似乎可以互换使用。

redis-ruby 实现:

r.pipelined {
  # these commands will be pipelined
  r.get("insensitive_key")
}

r.multi {
  # these commands will be executed atomically
  r.set("sensitive_key")
}

我只是使用MULTI/EXEC代替,但他们似乎会阻止所有其他用户,直到事务完成(在我的情况下不是必需的),所以我担心他们的表现。有没有人在 Booksleeve 中使用过管道,或者对如何实现它们有任何想法?

4

3 回答 3

6

在 BookSleeve 中,一切都是流水线式的。没有同步操作。一个都没有。因此,每个操作都会返回某种形式的Task(可能是 vanilla Task,可能是Task<string>,Task<long>等),在将来的某个时间点(即 redis 响应时)将具有值。您可以使用Waitat 您的调用代码执行同步等待,或ContinueWith/ await(C# 5 语言功能)执行异步回调。

交易也不例外;它们是流水线的。事务的唯一细微变化是它们在调用站点额外缓冲直到完成(因为它是一个多路复用器,我们不能开始管道传输与事务相关的消息,直到我们有一个完整的工作单元,因为它会对同一多路复用器上的其他呼叫者产生不利影响)。

所以:没有明确的原因.pipelined一切都是流水线和异步的。

于 2012-10-11T06:51:58.347 回答
4

流水线是一种协议级别的通信策略,与原子性无关。它与“交易”的概念完全正交。(例如,您可以MULTI .. EXEC在管道连接中使用。)

什么是流水线?

redis 最基本的连接器是以请求-回复方式交互的同步客户端。客户端发送一个请求,然后等待 Redis 的响应,然后再发送下一个请求。

在流水线中,客户端可以继续发送请求,而无需暂停查看每个请求的 Redis 响应。Redis 当然是单线程服务器和自然序列化点,因此请求顺序被保留并反映在响应顺序中。这意味着,客户端可以让一个线程发送请求(通常通过从请求队列中出列),而另一个线程不断处理来自 Redis 的响应。请注意,当然您仍然可以对单线程客户端使用流水线,但您确实会损失一些效率。两个线程模型允许充分利用本地 CPU 和网络带宽(例如饱和)。

如果您到目前为止一直在关注这一点,您必须问自己:那么,客户端的请求和响应是如何匹配的?好问题!有多种方法可以解决这个问题。在 JRedis 中,我将请求包装在一个 (java)Future对象中,以处理请求/响应处理的异步性。每次发送请求时,相应的 Future 对象都会被挂起的响应对象包装并排队。响应侦听器一次简单地从该队列中取出 1 个项目并解析响应(流)并更新未来对象。

现在,客户端的最终用户可以接触到同步或异步接口。如果接口是同步的,实现自然必须阻塞 Future 的响应。

如果您到目前为止已经遵循,那么应该清楚的是,使用流水线的同步语义的单线程应用程序破坏了流水线的整个目的(因为应用程序阻塞了响应并且没有忙于向客户端提供额外的请求。)但是如果该应用程序是多线程的,管道的同步接口允许您在处理 N 个客户端应用程序线程时使用单个连接。(所以在这里,它是一种帮助建立线程安全连接的实现策略。)

如果管道接口是异步的,那么即使是单线程客户端应用程序也可以受益。吞吐量至少增加了一个数量级。

(流水线注意事项:编写容错流水线客户端并非易事。)

理想情况下,我应该使用图表,但请注意剪辑结尾处发生的情况: http ://www.youtube.com/watch?v=NeK5ZjtpO-M

于 2011-12-07T18:16:49.063 回答
1

这是Redis 事务文档的链接

关于 BookSleeve,请参考 Marc 的这篇文章

“CreateTransaction() 创建一个暂存区来构建命令(使用完全相同的 API)并捕获未来的结果。然后,当调用 Execute() 时,缓冲的命令被组装成一个 MULTI/EXEC 单元并在一个连续的块中发送(显然,多路复用器会将所有这些一起发送)。”

如果您在事务中创建命令,它们将自动被“流水线化”。

于 2011-12-07T01:52:52.357 回答