web-dev-qa-db-ja.com

RedisのRedissonとJedis

今、redisにJavaクライアントを使用する必要があります。 Jedis および Redisson に遭遇しました。

[〜#〜] edit [〜#〜]:質問は一種の意見に基づいていたため、再構成します。

速度の面でどちらが効率的ですか?ベンチマークはありますか?

そのうちのどれが以下を提供できますか?

  • 分散ロック(およびマップ内のいくつかのキーを更新)

  • 自動キー有効期限通知ですが、これはサブスクライバーのグループの中から特定の1つのサブスクライバーのみに受信されるようにします(Apache Kafkaのコンシューマーグループの概念に似ています)。これをどのように達成できますか?

PS: this の重複としてマークしないでください。

30

その質問は意見に基づいていますが、それにいくつかの客観的なポイントを入れることができます:

TL; DR:

ドライバーの選択は、複数のことに依存します。

  • 追加の依存関係
  • プログラミングモデル
  • 拡張性
  • 高レベルの機能の実装に関して意見を述べる
  • プロジェクトの見通し、進化したい方向

説明

追加の依存関係

一部のプロジェクトでは、ライブラリを追加する際の追加の依存関係と一時的な依存関係について意見があります。

Jedisはほとんど依存関係がないため、接続プールにはApache Commons Pool 2が必要です。

Redissonでは、基本的な依存関係としてNetty、JCache API、およびProject Reactorが必要です。他の多くのライブラリ(Tomcatセッションストア)と統合されるため、拡張可能です。

プログラミングモデル

これが、Redisクライアントとのやり取りです。また、抽象化レベルも定義します。

Jedisは、Redis APIをJavaメソッド呼び出しとして公開する低レベルのドライバーです。

Jedis jedis = …;

jedis.set("key", "value");

List<String> values = jedis.mget("key", "key2", "key3");

Redissonは、さまざまなAPIオブジェクトを通じて機能を公開する高レベルのクライアントです。

Redisson redisson = …

RMap map = redisson.getMap("my-map"); // implement Java.util.Map

map.put("key", "value");

map.containsKey("key");

map.get("key");

各呼び出しは1つまたは複数のRedis呼び出しを呼び出し、それらのいくつかはLua(Redis "Scripting")で実装されます。

拡張性

Javaに使用できる複数のドライバーがあります。これらには、プロジェクトに適合するさまざまなプロパティがあります。スケーラビリティもそれに影響します。サポートするモデル。

JedisはブロッキングI/Oを使用し、メソッド呼び出しは同期的です。 I/Oがソケットで処理されるまで待機するプログラムフローが必要です。非同期(FutureCompletableFuture)または事後対応のサポート(RxJava ObservableまたはReactive Streams Publisher)はありません。

Jedisクライアントインスタンスはスレッドセーフではないため、接続プール(呼び出しスレッドごとのJedisインスタンス)が必要です。

Redissonは、ノンブロッキングI/Oと、イベント駆動型の通信層とnettyを使用します。メソッド呼び出しは、同期、非同期、またはリアクティブです(Project Reactor 2.0または3.1を使用)。接続はプールされますが、API自体はスレッドセーフであり、必要なリソースは少なくなります。私は完全にはわかりませんが、たぶんあなたは単一の接続で操作することさえできます。 Redisを使用する場合、これが最も効率的な方法です。

クライアントの実装に関する意見

これらの段落では、クライアントの実装方法について説明します。

どちらのクライアントも優れた機能を備えており、両方のライブラリで要件を満たすことができます。

Jedisは、OutputStreamにコマンドを書き込み、応答を解析する単純な実装です。それ以上。

高レベルの機能が必要な場合は、Redis APIを使用してこれらを実装する必要があります。呼び出すコマンドと結果の動作を完全に制御できます。機能を実装するには、ここで追加の作業が必要になる場合があります。

Redissonは、抽象化を通じて機能を提供する高レベルのクライアントです。これらのオブジェクトは、Redis(MapListSet、…)に支えられていることを知る必要なく使用できますが、各API呼び出しは1つ以上のRedisに変換されます一部のLuaスクリプトの実行を呼び出します。

Redissonの動作方法と機能の実装方法は好きでも嫌いでもかまいませんが、最終的にはできることはあまりありません。 Redissonsの高レベル機能を使用すると、実装作業が軽減される場合があります。

見通し

そのセクションは、あなたがどこに向かっているかに完全に依存しています。 Jedisは、すべてのRedis APIコマンド、Redis Standalone、Redis Sentinel、およびRedis Clusterをサポートしています。マスター-スレーブ設定にはスレーブ読み取りはありませんが、jedisがこれらの機能を提供するまでは時間の問題だと思います。

Jedisでは、非同期に移行することはできず、AWS ElastiCacheの高度な機能を使用するか、スレーブ読み取りには独自の実装が必要です。

Redissonは、さまざまなセットアップを幅広くカバーしています。 Jedisがサポートするすべてのものをサポートし、マスター/スレーブ設定の読み取り戦略を提供し、AWS ElastiCacheのサポートを改善しました。

53
mp911de