我正在使用Jedis(java客户端)与Redis服务器进行通信。我在三个不同的节点上运行了3个Redis实例。我想从3个Redis实例中“获取”(读取)一些记录。我想并行发出这些“获取”(读取),然后对接收到的数据进行一些处理并形成最终输出。
在java中执行此操作的最佳方法是什么?
其中一种方法是创建3个线程并在每个线程中“获取”(读取)(同步)。等待所有3个命令完成,然后合并结果。
Jedis是否有一种机制可以使用回调功能异步发出3个“gets”(任何命令)?
我有3个不同的Redis实例。那么你建议使用“ShardedJedisPipeline”(jedis / tests / ShardedJedisPipelineTest.java)与这些Redis实例并行进行交互吗?
普通Jedis管道(jedis / tests / PipeliningTest.java),只是向单个Redis实例发送多个命令,因此它们在Redis服务器上一个接一个地执行(以及最后可用的所有响应)。
所以我假设我必须使用“ShardedJedisPipeline”。但是这有两个局限: 1.我想在3个Redis实例上并行执行Lua脚本,即“eval”。 2.我不想要分片(Jedis使用的一些散列算法)来分发数据,或者自己(使用其算法)从实例读取数据。我们有不同的数据分发策略。所以我希望能够指定,记录应存储在哪个redis实例中,并相应地从哪里读取。 keyTags似乎提供了这种机制,但不确定如何将其与“eval”一起使用。
答案 0 :(得分:2)
您可以使用上述管道。 AsyncJedis是一项工作进展,将与下一版本的Jedis一起发布。它将基于netty并与vert.x兼容
答案 1 :(得分:0)
在此之前,您可以使用带有三个Jedis实例的ExecutorService自行滚动它,然后等待返回的期货。
答案 2 :(得分:0)
就2015年2月而言,Jedis显然不支持您在单个redis实例上的异步操作:https://github.com/xetorthio/jedis/issues/241
在你的情况下我会做的是继续使用3个主题并按照@Xorlev建议继续使用Futures和Executor Service。