5

我正在使用 Jedis(Java 客户端)与 Redis 服务器通信。我有 3 个 Redis 实例在三个不同的节点上运行。我想从 3 个 Redis 实例中“获取”(读取)一些记录。我想并行发出这些“获取”(读取),然后对接收到的数据进行一些处理并形成最终输出。

在java中执行此操作的最佳方法是什么?

一种方法是创建 3 个线程并在每个线程中(同步)发出“get”(读取)。等待所有 3 个命令完成,然后合并结果。

Jedis 是否具有异步发出 3 个“获取”(与此相关的任何命令)的机制,并带有回调功能?


我有 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”一起使用。

4

3 回答 3

2

您可以使用前面提到的管道。AsyncJedis 是一项正在进步的工作,将与 Jedis 的下一个版本一起发布。它将基于 netty 并与 vert.x 兼容

于 2012-07-05T11:03:49.373 回答
0

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

于 2012-08-01T15:16:33.223 回答
0

截至 2015 年 2 月,Jedis 显然不支持您需要的单个 redis 实例上的异步操作:https ://github.com/xetorthio/jedis/issues/241

在你的情况下,我会做的是继续使用 3 个线程,并按照上面的@Xorlev 建议继续使用 Futures 和 Executor Service。

于 2015-02-19T05:07:00.560 回答