Jedis是否支持异步操作?

5
我正在使用Jedis(Java客户端)与Redis服务器通信。我有3个Redis实例在三个不同的节点上运行。我想从这3个Redis实例中“获取”(读取)一些记录。我想并行发出这些"gets"(读取),然后对接收到的数据进行一些处理,并形成最终输出。
那么在Java中,什么是最好的方法呢?
其中一种方式是创建3个线程,在每个线程中发出一个“get”(读取)命令(同步)。等待所有3个命令完成,然后组合结果。
Jedis是否有机制可以异步地发出3个“gets”(任何命令),并带有回调功能?
我有3个不同的Redis实例。所以你建议使用“ShardedJedisPipeline”(jedis/tests/ShardedJedisPipelineTest.java)并行与这些Redis实例交互吗?
Normal Jedis Pipeline (jedis/tests/PipeliningTest.java)只向单个Redis实例发送多个命令,因此它们在Redis服务器上依次执行(并且所有响应在最后可用)。
所以我假设我必须使用“ShardedJedisPipeline”。但是,这有两个限制: 1. 我想并行执行Lua脚本,即在3个Redis实例上进行“eval”。 2. 我不想通过分片(由Jedis使用的一些哈希算法)分发数据或自行(使用其算法)从实例中读取数据。我们有一个不同的分发数据策略。因此,我希望能够指定应该在哪个Redis实例上存储记录并相应地从何处读取记录。 keyTags似乎提供了这种机制,但不确定如何将其与“eval”一起使用。

redis.clients.jedis.Pipeline? - Alexei Kaigorodov
3个回答

2

您可以按照提到的方法使用pipeline。 AsyncJedis正在进行中,并将在下一个版本的Jedis中发布。它将基于netty,并且与vert.x兼容。


我有3个不同的Redis实例。那么你建议使用“ShardedJedisPipeline”(jedis/tests/ShardedJedisPipelineTest.java)来并行地与这些Redis实例进行交互吗?普通的Jedis Pipeline(jedis/tests/PipeliningTest.java)只是将多个命令发送到单个Redis实例,因此它们在Redis服务器上一个接一个地执行(并且所有响应在最后可用)。 - sunillp
1
所以我认为我必须使用“ShardedJedisPipeline”。但是这有两个限制:1. 我想在3个Redis实例上并行执行Lua脚本,即“eval”。2. 我不想要分片(Jedis使用的一些哈希算法)来分发数据或自己(使用其算法)从实例中读取数据。我们有一种不同的分发数据策略。因此,我希望能够指定应将记录存储在哪个Redis实例中,并相应地从哪里读取它。keyTags似乎提供了这种机制,但不确定如何在“eval”中使用它。 - sunillp

0

在那之前,您可以使用具有三个Jedis实例的ExecutorService自己滚动它,然后等待返回的futures。


0
截至2015年2月,Jedis显然不支持在单个redis实例上进行异步操作,因为您需要:https://github.com/xetorthio/jedis/issues/241 如果我是你,我会使用3个线程,并像@Xorlev上面建议的那样继续使用Futures和Executor Service。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接