===

  • 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プロジェクト

にコードサンプルがあります。