C# 如何使用Booksleeve实现Redis管道化请求?

C# 如何使用Booksleeve实现Redis管道化请求?,c#,.net,redis,booksleeve,C#,.net,Redis,Booksleeve,对于Redis交易和管道之间的区别,以及最终如何将管道与Booksleeve结合使用,我有点困惑。我看到它支持Redis(MULTI/EXEC),但是在它的API/测试中没有提到流水线功能。然而,在其他实现中很明显,管道和事务之间存在区别,即在中,正如下面的redis ruby版本所证明的,但在某些情况下,这些术语似乎可以互换使用 redis ruby实现: r.pipelined { # these commands will be pipelined r.get("insensiti

对于Redis交易和管道之间的区别,以及最终如何将管道与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一起使用过,或者对如何实现它们有什么想法?

这里是到的链接

关于书套,请参考Marc

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


如果在事务中创建命令,它们将自动“管道化”。

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

什么是流水线

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

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

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

现在,客户机的最终用户可以使用同步或异步接口。如果接口是同步的,那么实现自然必须阻止未来的响应

如果到目前为止您已经了解了,那么应该清楚的是,使用同步语义和流水线的单线程应用程序无法实现流水线的全部目的(因为该应用程序正在阻塞响应,并且不忙于向客户端提供额外的请求。)但是如果该应用程序是多线程的,管道的同步接口允许您在处理N个客户端应用程序线程时使用单个连接。(因此,这是一种帮助构建线程安全连接的实现策略。)

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

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

理想情况下,我应该使用一个图表,但要注意剪辑结束时会发生什么:

在书套中,一切都是管道化的。没有同步操作。一个也没有。因此,每个操作都会返回某种形式的
任务
(可以是普通的
任务
,也可以是
任务
任务
,等等),这些任务在将来的某个时候(即redis响应时)将具有值。您可以在调用代码时使用
Wait
执行同步等待,或者使用
ContinueWith
/
Wait
(C#5语言功能)执行异步回调

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


因此:没有明确的
。管道化
的原因是一切都是管道化和异步的。

然而,“事务”和“管道化”之间仍然有区别,前者是redis支持的正式功能,而后者只是客户端发送多个(单独的)数据的能力一起请求。我问的是后者,因为我不需要原子性,Booksleeve的收费是。谢谢你的回答,这是我目前正在使用的。谢谢你的详细解释。然而,我的问题主要是如何在Booksleeve Redis客户机上使用此功能(如果可能的话),而不是一般的实现方式。我是在解决“Redis事务和管道之间的区别有点混淆”的问题。至于书套(不知道)可能是