5

Redis サーバーと通信するために Jedis (Java クライアント) を使用しています。3 つの異なるノードで実行されている 3 つの Redis インスタンスがあります。3 つの Redis インスタンスからいくつかのレコードを「取得」(読み取り) したいと考えています。これらの「取得」(読み取り) を並行して発行し、受信したデータに対して何らかの処理を行い、最終的な出力を形成したいと考えています。

Javaでこれを行う最良の方法は何ですか?

方法の 1 つは、3 つのスレッドを作成し、それぞれで (同期的に) "get" (読み取り) を発行することです。3 つのコマンドがすべて完了するのを待ってから、結果を結合します。

Jedis には、コールバック機能を使用して、3 つの「取得」(その件に関する任意のコマンド) を非同期で発行するメカニズムがありますか?


3 つの異なる Redis インスタンスがあります。これらのRedisインスタンスと並行してやり取りするために「ShardedJedisPipeline」(jedis/tests/ShardedJedisPipelineTest.java)を使用することをお勧めしますか?

通常の Jedis パイプライン (jedis/tests/PipeliningTest.java) は、単一の Redis インスタンスに複数のコマンドを送信するだけなので、それらは Redis サーバーで次々に実行されます (そして最後にすべての応答が利用可能になります)。

したがって、「ShardedJedisPipeline」を使用する必要があると思います。ただし、これには 2 つの制限があります。 1. Lua スクリプト、つまり「eval」を 3 つの Redis インスタンスで並行して実行したい。2. シャーディング (Jedis が使用するハッシュ アルゴリズム) を使用してデータを配布したり、単独で (そのアルゴリズムを使用して) インスタンスからデータを読み取ったりしたくありません。データを配布するための別の戦略があります。したがって、レコードをどの redis インスタンスに保存し、それに応じてどこから読み取るかを指定できるようにしたいと考えています。keyTags はこのメカニズムを提供しているようですが、これを「eval」で使用する方法がわかりません。

4

3 に答える 3

2

前述のようにパイプラインを使用できます。AsyncJedis は進行中の作業であり、Jedis の次のバージョンでリリースされる予定です。これは netty に基づいており、vert.x と互換性があります。

于 2012-07-05T11:03:49.373 に答える
0

それまでは、3 つの Jedis インスタンスを持つ ExecutorService を使用して自分でロールバックし、返される先物を待つことができます。

于 2012-08-01T15:16:33.223 に答える
0

2015 年 2 月まで、Jedis は必要に応じて単一の redis インスタンスでの非同期操作をサポートしていないようです: https://github.com/xetorthio/jedis/issues/241

あなたのケースで私がすることは、@Xorlevが上記で提案したように、3つのスレッドを進め、FuturesとExecutor Serviceを進めることです。

于 2015-02-19T05:07:00.560 に答える