RedissonとRedisのガイド

===

  • RedissonはJava ** 用のRedisクライアントです。この記事では、その機能のいくつかを探り、分散ビジネス・アプリケーションの構築を容易にする方法を説明します。

  • RedissonはRedisによって支えられた分散Javaオブジェクトとサービスを提供するインメモリデータグリッドを構成します 分散インメモリデータモデルはアプリケーションとサーバー間でドメインオブジェクトとサービスの共有を可能にします。

この記事では、Redissonのセットアップ方法、動作方法の理解、そしてRedissonのオブジェクトとサービスについて説明します。

===

以下のセクションを pom.xmlに追加して、 Redisson__をプロジェクトにインポートすることから始めましょう。

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.3.0</version>
</dependency>

この依存関係の最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.redisson%22%20AND%20a%3A%22redisson%22[here]にあります。 。

===

始める前に、最新バージョンのRedisをセットアップして実行していることを確認する必要があります。 Redisを持っておらず、LinuxまたはMacintoshを使用している場合は、http://redis.io/topics/quickstart[ここ]の情報に従ってセットアップしてください。あなたがWindowsユーザーなら、この非公式のhttps://github.com/MSOpenTech/redis[port]を使ってRedisをセットアップすることができます。

Redisに接続するようにRedissonを設定する必要があります。 Redissonは、以下のRedis構成への接続をサポートします。

  • 単一ノード

  • スレーブノードを持つマスター

  • センチネルノード

  • クラスタノード

複製ノード

  • Redissonは、クラスター化されたノードとレプリケートされたノードに対して、Amazon Webサービス(AWS)ElastiCacheクラスターとAzure Redis Cache ** をサポートしています。

Redisのシングルノードインスタンスに接続しましょう。このインスタンスはデフォルトポート6379でローカルに実行されています。

RedissonClient client = Redisson.create();

Redisson オブジェクトの create メソッドにさまざまな設定を渡すことができます。これは、異なるポートに接続するための設定、またはRedisクラスターに接続するための設定です。この設定は、Javaコードでも、外部設定ファイルからロードすることもできます。

3.1. Javaの設定

JavaコードでRedissonを設定しましょう。

Config config = new Config();
config.useSingleServer()
  .setAddress("127.0.0.1:6379");

RedissonClient client = Redisson.create(config);

RedConfigurationを Config オブジェクトのインスタンスで指定し、それを create メソッドに渡します。上記では、Redisの単一ノードインスタンスに接続することをRedissonに指定しました。これを行うには、 Config オブジェクトの useSingleServer メソッドを使用しました。これは、 SingleServerConfig オブジェクトへの参照を返します。

SingleServerConfig オブジェクトには、RedissonがRedisの単一ノードインスタンスに接続するために使用する設定があります。ここでは、その setAddress メソッドを使用して address 設定を構成します。これは接続しているノードのアドレスを設定します。その他の設定には、 retryAttempts connectionTimeout 、および clientName があります。これらの設定は、対応する設定メソッドを使って設定されます。

Config オブジェクトの以下のメソッドを使用して、さまざまなRedis設定用にRedissonを同様に設定できます。

  • useSingleServer - 単一ノードインスタンスの場合単一ノード設定を取得

こちら ** useMasterSlaveServers - スレーブノードを持つマスター用。取得する

マスタースレーブノード設定 ここ ** useSentinelServers - センチネルノードの場合センチネルノード設定を取得する

こちら ** useClusterServers - クラスターノード用。クラスタ化されたノード設定を取得する

https://github.com/redisson/redisson/wiki/2.-Configuration#241-cluster-settings ** useReplicatedServers - 複製ノード用。複製ノードを取得する

設定https://github.com/redisson/redisson/wiki/2.-Configuration#251-replicated-settings[こちら]

3.2. ファイル構成

  • Redissonは外部のJSONまたはYAML ** ファイルから設定を読み込むことができます。

Config config = Config.fromJSON(new File("singleNodeConfig.json"));
RedissonClient client = Redisson.create(config);

Config オブジェクトの fromJSON メソッドは、文字列、ファイル、入力ストリームまたはURLから設定を読み込むことができます。

これは singleNodeConfig.json ファイルの設定例です。

{
    "singleServerConfig": {
        "idleConnectionTimeout": 10000,
        "pingTimeout": 1000,
        "connectTimeout": 10000,
        "timeout": 3000,
        "retryAttempts": 3,
        "retryInterval": 1500,
        "reconnectionTimeout": 3000,
        "failedAttempts": 3,
        "password": null,
        "subscriptionsPerConnection": 5,
        "clientName": null,
        "address": "redis://127.0.0.1:6379",
        "subscriptionConnectionMinimumIdleSize": 1,
        "subscriptionConnectionPoolSize": 50,
        "connectionMinimumIdleSize": 10,
        "connectionPoolSize": 64,
        "database": 0,
        "dnsMonitoring": false,
        "dnsMonitoringInterval": 5000
    },
    "threads": 0,
    "nettyThreads": 0,
    "codec": null,
    "useLinuxNativeEpoll": false
}

これは対応するYAML設定ファイルです。

singleServerConfig:
    idleConnectionTimeout: 10000
    pingTimeout: 1000
    connectTimeout: 10000
    timeout: 3000
    retryAttempts: 3
    retryInterval: 1500
    reconnectionTimeout: 3000
    failedAttempts: 3
    password: null
    subscriptionsPerConnection: 5
    clientName: null
    address: "redis://127.0.0.1:6379"
    subscriptionConnectionMinimumIdleSize: 1
    subscriptionConnectionPoolSize: 50
    connectionMinimumIdleSize: 10
    connectionPoolSize: 64
    database: 0
    dnsMonitoring: false
    dnsMonitoringInterval: 5000
threads: 0
nettyThreads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
useLinuxNativeEpoll: false

その設定に固有の設定を使用して、同様の方法でファイルから他のRedis設定を設定できます。ご参考までに、ここにJSONおよびYAMLファイル形式があります。

  • シングルノード -

フォーマット ** センチネルノード -

フォーマット ** 複製ノード -

Java設定をJSONまたはYAML形式に保存するには、 Config オブジェクトの toJSON または toYAML メソッドを使用できます。

Config config = new Config();//... we configure multiple settings here in Java
String jsonFormat = config.toJSON();
String yamlFormat = config.toYAML();

Redissonの設定方法がわかったので、Redissonが操作を実行する方法を見てみましょう。

===

  • Redissonは、同期、非同期、およびリアクティブインタフェースをサポートしています** 。

これらのインタフェースに対する操作はスレッドセーフです。

RedissonClient によって生成されたすべてのエンティティ(オブジェクト、コレクション、ロック、およびサービス)には、同期メソッドと非同期メソッドがあります。 同期メソッドは非同期バリアントを持っています 。これらのメソッドには通常、「Async」を付加した同期バリアントの同じメソッド名が付けられています。

RAtomicLong オブジェクトの同期メソッドを見てみましょう。

RedissonClient client = Redisson.create();
RAtomicLong myLong = client.getAtomicLong('myLong');

同期 compareAndSet メソッドの非同期バリアントは次のようになります。

RFuture<Boolean> isSet = myLong.compareAndSetAsync(6, 27);

このメソッドの非同期バリアントは、 RFuture オブジェクトを返します。このオブジェクトにリスナーを設定して、結果が利用可能になったときに結果を取り戻すことができます。

isSet.handle((result, exception) -> {
   //handle the result or exception here.
});

反応オブジェクトを生成するには、 RedissonReactiveClient を使用する必要があります。

RedissonReactiveClient client = Redisson.createReactive();
RAtomicLongReactive myLong = client.getAtomicLong("myLong");

Publisher<Boolean> isSetPublisher = myLong.compareAndSet(5, 28);

このメソッドはhttp://www.reactive-streams.org/[Reactive Streams]Standard for Java 9に基づいて反応性オブジェクトを返します。

Redissonが提供するいくつかの分散オブジェクトを調べてみましょう。

===

  • Redissonオブジェクトの個々のインスタンスはシリアライズされ、Redisson ** をサポートする利用可能なRedisノードのいずれかに格納されます。これらのオブジェクトは、クラスタ内で複数のノードに分散させることができ、単一のアプリケーションまたは複数のアプリケーション/サーバからアクセスすることができます。

これらの分散オブジェクトは、__java.util.concurrent.atomicパッケージの仕様に従います。 これらは、Redis ** に格納されているオブジェクトに対するロックフリー、スレッドセーフ、およびアトミック操作をサポートします。別のアプリケーションがオブジェクトを読み取っている間は値が更新されないため、アプリケーション/サーバー間のデータの整合性が保証されます。

RedissonオブジェクトはRedisキーにバインドされています。これらのキーは RKeys インターフェースを通して管理できます。これらのキーを使ってRedissonオブジェクトにアクセスします。

すべてのキーを取得できます。

RKeys keys = client.getKeys();

すべてのキー名を反復可能な文字列コレクションとして抽出できます。

Iterable<String> allKeys = keys.getKeys();

パターンに準拠したキーを取得できます。

Iterable<String> keysByPattern = keys.getKeysByPattern('key** ')

RKeysインターフェースでは、キーの削除、パターンによるキーの削除、およびキーとオブジェクトの管理に使用できるその他の便利なキーベースの操作も可能です。

Redissonが提供する分散オブジェクトは以下の通りです。

  • ObjectHolder

  • BinaryStreamHolder

  • GeospatialHolder

  • ビットセット

  • AtomicLong

  • AtomicDouble

  • トピック

  • ブルームフィルター

  • HyperLogLog

これらのオブジェクトのうちの3つを見てみましょう。

5.1. オブジェクトホルダー

RBucket クラスで表されるこのオブジェクトは、あらゆる種類のオブジェクトを保持できます。このオブジェクトの最大サイズは512MBです。

RBucket<Ledger> bucket = client.getBucket("ledger");
bucket.set(new Ledger());
Ledger ledger = bucket.get();

RBucket オブジェクトは、それが保持するオブジェクトに対して compareAndSetや getAndSet などのアトミック操作を実行できます。

5.2. AtomicLong

RAtomicLong クラスで表されるこのオブジェクトは、 java.util.concurrent.atomic.AtomicLong クラスとよく似ており、自動的に更新できる long 値を表します。

RAtomicLong atomicLong = client.getAtomicLong("myAtomicLong");
atomicLong.set(5);
atomicLong.incrementAndGet();

5.3. トピック

Topic オブジェクトはRedisの「パブリッシュおよびサブスクライブ」メカニズムをサポートします。公開されたメッセージを聞くには

RTopic<CustomMessage> subscribeTopic = client.getTopic("baeldung");
subscribeTopic.addListener(
  (channel, customMessage)
  -> future.complete(customMessage.getMessage()));

上では、 Topic は“ baeldung”チャンネルからのメッセージを聞くために登録されています。次に、そのチャネルからの着信メッセージを処理するためにトピックにリスナーを追加します。 1つのチャンネルに複数のリスナーを追加することができます。

「baeldung」チャンネルにメッセージを公開しましょう。

RTopic<CustomMessage> publishTopic = client.getTopic("baeldung");
long clientsReceivedMessage
  = publishTopic.publish(new CustomMessage("This is a message"));

これは他のアプリケーションやサーバーから公開される可能性があります。 CustomMessage オブジェクトはリスナーによって受信され、 onMessage メソッドの定義に従って処理されます。

他のRedissonオブジェクトhttps://github.com/redisson/redisson/wiki/6.-distributed-objects[ここ]についてもっと学ぶことができます。

===

オブジェクトを処理するのと同じ方法でRedissonコレクションを処理します。

Redissonが提供する分散コレクションには、以下のものがあります。

  • 地図

  • マルチマップ

  • セット

  • SortedSet

  • ScoredSortedSet

  • Lex _SortedSet _

  • リスト

  • キュー

  • Deque

  • BlockingQueue

  • BoundedBlockingQueue

  • BlockingDeque

  • BlockingFairQueue

  • DelayedQueue

  • PriorityQueue

  • PriorityDeque

これらのコレクションのうちの3つ、 Map、Set、 、および__Listを見てみましょう。

6.1. 地図

Redissonベースのマップは java.util.concurrent.ConcurrentMap および java.util.Map インターフェースを実装しています。 Redissonには4つのマップ実装があります。

これらは RMap RMapCache RLocalCachedMap 、および RClusteredMap です。

Redissonで地図を作りましょう:

RMap<String, Ledger> map = client.getMap("ledger");
Ledger newLedger = map.put("123", new Ledger());map

RMapCache はマップエントリの削除をサポートしています。 RLocalCachedMap は、マップエントリのローカルキャッシュを許可します。 RClusteredMap____を使用すると、単一のマップからのデータをRedisクラスターマスターノード間で分割することができます。

Redissonマップhttps://github.com/redisson/redisson/wiki/7.-distributed-collections#71-map[here]についての詳細を学ぶことができます。

6.2. セット

Redissonベースの Set は、 java.util.Set インターフェースを実装しています。

Redissonには、対応するマップと同様の機能を持つ3つの Set 実装( RSet RSetCache 、および RClusteredSet )があります。

Redissonで Set を作成しましょう。

RSet<Ledger> ledgerSet = client.getSet("ledgerSet");
ledgerSet.add(new Ledger());

Redissonセットhttps://github.com/redisson/redisson/wiki/7.-distributed-collections#71-map[here]についての詳細を学ぶことができます。

6.3. リスト

Redissonベースの Lists は、 java.util.List インターフェースを実装しています。

Redissonで List を作成しましょう。

RList<Ledger> ledgerList = client.getList("ledgerList");
ledgerList.add(new Ledger());

我々は他のRedissonコレクションhttps://github.com/redisson/redisson/wiki/7.-distributed-collections[here]についてもっと学ぶことができます。

===

Redissonの 分散ロックは、アプリケーション/サーバー間で スレッド同期を可能にします。 Redissonのロックとシンクロナイザのリストは次のとおりです。

  • ロック

  • FairLock

  • マルチロック

  • ReadWriteLock

  • セマフォ

  • PermitExpirableSemaphore

  • CountDownLatch

Lock と__MultiLockを見てみましょう。

7.1. ロック

Redissonの Lock java.util.concurrent.locks.Lock インターフェースを実装しています。

RLock クラスで表されるロックを実装しましょう。

RLock lock = client.getLock("lock");
lock.lock();//perform some long operations...
lock.unlock();

7.2. マルチロック

Redissonの RedissonMultiLock は複数の RLock オブジェクトをグループ化し、それらを単一のロックとして扱います。

RLock lock1 = clientInstance1.getLock("lock1");
RLock lock2 = clientInstance2.getLock("lock2");
RLock lock3 = clientInstance3.getLock("lock3");

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
lock.lock();//perform long running operation...
lock.unlock();

他のロックについてもっと学ぶことができますhttps://github.com/redisson/redisson/wiki/8.-distributed-locks-and-synchronizers[ここ]。

===

Redissonは4種類の分散サービスを公開しています。これらは: リモートサービス Live Object Service Executorサービス Scheduled Executorサービス です。リモートサービスとLive Object Serviceを見てみましょう。

** 8.1. リモートサービス+

**

このサービスは、Redisによって促進されたJavaリモートメソッド呼び出しを提供します。 Redissonリモートサービスは、サーバーサイド(ワーカーインスタンス)とクライアントサイドの実装で構成されています。サーバーサイドの実装は、クライアントによって呼び出されたリモートメソッドを実行します。リモートサービスからの呼び出しは、同期または非同期のどちらでもかまいません。

サーバー側は、リモート呼び出し用のインタフェースを登録します。

RRemoteService remoteService = client.getRemoteService();
LedgerServiceImpl ledgerServiceImpl = new LedgerServiceImpl();

remoteService.register(LedgerServiceInterface.class, ledgerServiceImpl);

クライアント側は、登録されているリモートインタフェースのメソッドを呼び出します。

RRemoteService remoteService = client.getRemoteService();
LedgerServiceInterface ledgerService
  = remoteService.get(LedgerServiceInterface.class);

List<String> entries = ledgerService.getEntries(10);

リモートサービスの詳細については、https://github.com/redisson/redisson/wiki/9.-distributed-services#91-remote-service[here]をご覧ください。

8.2. ライブオブジェクトサービス

Redisson Live Objectsは、単一のJVMからしかアクセスできない標準Javaオブジェクトの概念を、異なるマシンの異なるJVM間で共有できる 拡張Javaオブジェクト に拡張します。これは、オブジェクトのフィールドをRedisハッシュにマッピングすることによって達成されます。このマッピングは、実行時に構築されたプロキシクラスを介して行われます。フィールドゲッターとセッターはRedisのhget/hsetコマンドにマッピングされます。

Redisson Live Objectsは、Redisのシングルスレッドの性質により、アトミックフィールドアクセスをサポートします。

ライブオブジェクトの作成は簡単です:

@REntity
public class LedgerLiveObject {
    @RId
    private String name;

   //getters and setters...
}

クラスに @ REntity と、一意のフィールドまたは識別フィールドに @ RId という注釈を付けます。これが完了したら、アプリケーションでLive Objectを使用できます。

RLiveObjectService service = client.getLiveObjectService();

LedgerLiveObject ledger = new LedgerLiveObject();
ledger.setName("ledger1");

ledger = service.persist(ledger);

new キーワードを使用して、標準のJavaオブジェクトのようにLiveオブジェクトを作成します。次に、 persist メソッドを使用して RLiveObjectService のインスタンスを使用してオブジェクトをRedisに保存します。

オブジェクトが以前にRedisに永続化されている場合は、オブジェクトを取得できます。

LedgerLiveObject returnLedger
  = service.get(LedgerLiveObject.class, "ledger1");

RLiveObjectService を使用して、 @ RId のアノテーションが付けられたフィールドを使用してライブオブジェクトを取得します。

Redisson Live Objectsの詳細については、https://github.com/redisson/redisson/wiki/9.-distributed-services#92-live-object-service[here]をご覧ください。

他のRedissonサービスhttps://github.com/redisson/redisson/wiki/9.-distributed-services[here]についても学ぶことができます。

===

Redissonはパイプライン化をサポートしています。 複数の操作を単一のアトミック操作としてまとめることができます 。これは RBatch クラスによって促進されます。

複数のコマンドは、実行される前に RBatch オブジェクトインスタンスに対して集約されます。

RBatch batch = client.createBatch();
batch.getMap("ledgerMap").fastPutAsync("1", "2");
batch.getMap("ledgerMap").putAsync("2", "5");

List<?> result = batch.execute();

===

RedissonはLUAスクリプトをサポートしています。 Redisに対してLUAスクリプトを実行することができます :

client.getBucket("foo").set("bar");
String result = client.getScript().eval(Mode.READ__ONLY,
  "return redis.call('get', 'foo')", RScript.ReturnType.VALUE);

===

まだRedissonでサポートされていないRedis操作を実行したいと思うかもしれません。 RedissonはネイティブのRedisコマンドの実行を許可する低レベルのクライアントを提供します :

RedisClient client = new RedisClient("localhost", 6379);
RedisConnection conn = client.connect();
conn.sync(StringCodec.INSTANCE, RedisCommands.SET, "test", 0);

conn.closeAsync();
client.shutdown();

低レベルクライアントは非同期操作もサポートします。

===

この記事ではRedissonと、分散アプリケーションの開発に理想的な機能のいくつかを紹介しました。その分散オブジェクト、コレクション、ロック、およびサービスを調べました。また、パイプライン処理、スクリプト作成、およびその低レベルのクライアントなど、その他の機能についても調べました。

  • Redissonは、JCache API、Spring Cache、Hibernate Cache、Spring Sessionsなどの他のフレームワーク** との統合も提供します。他のフレームワークとの統合についてもっと学ぶことができますhttps://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks[ここ]。

GitHubプロジェクト にコードサンプルがあります。