使用上の注意:JDK8以降が必要であり、redisバージョンは2.6以上です。
公式文書:https://lettuce.io/core/release/reference/index.html#getting-started.get-it
1.レタスの紹介
Lettuceは、nettyとReactorに基づくスケーラブルなスレッドセーフなRedisクライアントです。Lettuceは、Redisと対話するための同期、非同期、およびリアクティブAPIを提供します。
2.基本的な使用法
レタスを使用する場合、主に次の4つのコンポーネントに依存します。
①redisURI:接続情報。
②redisClient:Redisクライアント。クラスターモードの場合、クラスターに接続されたカスタマイズされたRedisClusterClientがあります。
③接続:Redis接続。
④redisCommands:RedisコマンドAPIインターフェース。基本的に、Redisリリースバージョンのすべてのコマンドをカバーし、同期(同期)、非同期(非同期)、およびリアクティブ(相対)呼び出しメソッドを提供します。
Maven
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
2.1スタンドアロンモード
2.1.1同期(同期)
はじめにケース:
/** 初始化四个组件 **/
RedisURI redisUri = RedisURI.builder()
.withHost("192.168.139.198")
.withPort(6379)
.withTimeout(Duration.of(10, ChronoUnit.SECONDS))
.build();
RedisClient redisClient = RedisClient.create(redisUri);
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisCommands<String, String> redisCommands = connection.sync();
/** API的使用 **/
String result = redisCommands.set("name", "gaojian");
System.out.println(result);
result = redisCommands.get("name");
System.out.println(result);
/** 关闭资源 **/
connection.close();
redisClient.shutdown();
タイムアウト期間は、以下の設定で設定できます。
SetArgs timeout = SetArgs.Builder.nx().ex(5);
String result = redisCommands.set("name", "gaojian", timeout);
すべての接続は、RedisClientからデフォルトのタイムアウトを継承します。デフォルトのタイムアウトは60秒です。タイムアウトが経過する前に非ブロッキングコマンドが結果を返さない場合、RedisExceptionがスローされます。これは、RedisClientまたは各接続で変更できます(上記のとおり)。 )。Redisが正しく応答しない場合、同期メソッドはRedisCommandExecutionExceptionをスローし、非同期接続は例外をスローしません。
Redis接続は次のように設計されています長寿命また、スレッドセーフです。接続が失われた場合、close()が呼び出されるまで再接続します。再接続が成功すると、タイムアウトしていない保留中のコマンドが(再)送信されるため、アプリケーションの終了時に接続が閉じられると同時に、クライアントインスタンスが閉じられてスレッドとリソースが解放されます。
2.1.2非同期(非同期)
非同期方式では、ネットワークまたはディスクI / Oを待機しているスレッドを無駄にするのではなく、システムリソースをより有効に活用できます。スレッドを最大限に活用して、他の作業を実行できます。Lettuceは、Nettyベースのクライアント(マルチスレッドのイベント駆動型I / Oフレームワーク)上にクライアントを構築することにより、非同期性を促進します。すべての通信は非同期で処理されます。
/** 初始化四个组件 **/
RedisURI redisUri = RedisURI.builder()
.withHost("192.168.139.198")
.withPort(6379)
.withTimeout(Duration.of(10, ChronoUnit.SECONDS))
.build();
RedisClient redisClient = RedisClient.create(redisUri);
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisAsyncCommands<String, String> asyncCommands = connection.async();
/** API的使用 **/
RedisFuture<String> future = asyncCommands.set("age", "18");
future.get(10,TimeUnit.SECONDS);
future.thenAccept(new Consumer<String>() {
@Override
public void accept(String value) {
System.out.println(value);
}
});
RedisFuture<String> redisFuture = asyncCommands.get("age");
redisFuture.get(10,TimeUnit.SECONDS);
redisFuture.thenAccept(new Consumer<String>() {
@Override
public void accept(String value) {
System.out.println(value);
}
});
/** 关闭资源 **/
connection.close();
redisClient.shutdown();
get()メソッド(pull)を呼び出すと、少なくとも値が計算されるまで呼び出し元のスレッドがブロックされますが、最悪の場合、スレッドが無期限にブロックされます。スレッドが無期限にブロックされないようにするには、次を使用することをお勧めします。タイムアウト構成。
2.1.3レスポンシブ(リアクター)
著者は一時的に方法を説明しません
2.2クラスターモード
Redisクラスターに接続するには、1つ以上の初期シードノードが必要です。完全なクラスタートポロジビュー(パーティション)は最初の接続で取得されるため、すべてのクラスターノードを指定する必要はありません。複数のシードノードを指定すると、シードノードが使用できない場合でもレタスがクラスターに接続できるため、復元力の向上に役立ちます。
注:クラスター接続自体は、ノード接続を使用してクラスター操作を実行します。接続がブロックされると、クラスター接続の他のすべてのユーザーが影響を受ける可能性があります。
2.2.1同期(同期)
RedisURI node1 = RedisURI.create("192.168.139.172", 7000);
RedisURI node2 = RedisURI.create("192.168.139.172", 7001);
RedisURI node3 = RedisURI.create("192.168.139.172", 7002);
RedisURI node4 = RedisURI.create("192.168.139.172", 7003);
RedisURI node5 = RedisURI.create("192.168.139.172", 7004);
RedisURI node6 = RedisURI.create("192.168.139.172", 7005);
RedisClusterClient clusterClient = RedisClusterClient.create(Arrays.asList(node1,node2,node3,node4,node5,node6));
StatefulRedisClusterConnection<String, String> connection = clusterClient.connect();
RedisAdvancedClusterCommands<String, String> clusterCommands = connection.sync();
/** API的使用 **/
String set = clusterCommands.set("name", "gaojian");
System.out.println(set);
String name = clusterCommands.get("name");
System.out.println(name);
connection.close();
clusterClient.shutdown();
2.2.2非同期(非同期)
RedisURI node1 = RedisURI.create("192.168.139.172", 7000);
RedisURI node2 = RedisURI.create("192.168.139.172", 7001);
RedisURI node3 = RedisURI.create("192.168.139.172", 7002);
RedisURI node4 = RedisURI.create("192.168.139.172", 7003);
RedisURI node5 = RedisURI.create("192.168.139.172", 7004);
RedisURI node6 = RedisURI.create("192.168.139.172", 7005);
RedisClusterClient clusterClient = RedisClusterClient.create(Arrays.asList(node1,node2,node3,node4,node5,node6));
StatefulRedisClusterConnection<String, String> connection = clusterClient.connect();
RedisAdvancedClusterAsyncCommands<String, String> asyncCommands = connection.async();
/** API的使用 **/
RedisFuture<String> future = asyncCommands.set("name", "gaojian");
future.get(10,TimeUnit.SECONDS);
future.thenAccept(new Consumer<String>() {
@Override
public void accept(String value) {
System.out.println(value);
}
});
RedisFuture<String> redisFuture = asyncCommands.get("name");
redisFuture.get(10,TimeUnit.SECONDS);
redisFuture.thenAccept(new Consumer<String>() {
@Override
public void accept(String value) {
System.out.println(value);
}
});
connection.close();
clusterClient.shutdown();
2.2.3反応(リアクター)
著者は一時的に方法を説明しません
2.3接続プール
レタス接続はスレッドセーフになるように設計されているため、接続を複数のスレッド間で共有できます。デフォルトでは、レタス接続は自動的に再接続されます。ほとんどの場合、接続プールは必要ありませんが、Lettuceは接続プールもサポートしているため、常に複雑さとメンテナンスコストが発生します。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.3</version>
</dependency>
RedisClusterClient clusterClient = RedisClusterClient.create(RedisURI.create("192.168.139.198", 6379));
GenericObjectPool<StatefulRedisClusterConnection<String, String>> pool = ConnectionPoolSupport
.createGenericObjectPool(() -> clusterClient.connect(), new GenericObjectPoolConfig());
StatefulRedisClusterConnection<String, String> connection = pool.borrowObject();
String age = connection.sync().set("age", "123");
System.out.println(age);
connection.sync().blpop(10, "age");
String age1 = connection.sync().get("age");
System.out.println(age1);
pool.close();
clusterClient.shutdown();