【问题标题】:Does Jedis support async operationsJedis 是否支持异步操作
【发布时间】:2012-07-05 12:56:21
【问题描述】:

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

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

【问题讨论】:

  • redis.clients.jedis.Pipeline?

标签: java asynchronous redis jedis


【解决方案1】:

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

【讨论】:

  • 我有 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”一起使用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2011-06-29
      • 2013-03-12
      • 2013-09-25
      相关资源
      最近更新 更多