ドライバー
Redis および Spring を使用する場合の最初のタスクの 1 つは、IoC コンテナーを介してストアに接続することです。これを行うには、Java コネクター (またはバインディング) が必要です。選択したライブラリに関係なく、Spring Data Redis API のセットを 1 つだけ使用する必要があります (すべてのコネクターで一貫して動作します)。Redis へのアクティブな接続を操作および取得するための org.springframework.data.redis.connection
パッケージとその RedisConnection
および RedisConnectionFactory
インターフェース。
RedisConnection および RedisConnectionFactory
RedisConnection
は、Redis バックエンドとの通信を処理するため、Redis 通信のコア構成要素を提供します。また、基礎となる接続ライブラリの例外を Spring の一貫した DAO 例外階層に自動的に変換するため、操作セマンティクスが同じままであるため、コードを変更せずにコネクターを切り替えることができます。
ネイティブライブラリ API が必要なコーナーケースのために、RedisConnection は、通信に使用される生の基になるオブジェクトを返す専用のメソッド(getNativeConnection )を提供します。 |
アクティブな RedisConnection
オブジェクトは、RedisConnectionFactory
を介して作成されます。さらに、ファクトリは PersistenceExceptionTranslator
オブジェクトとして機能します。つまり、宣言されると、透過的な例外変換を実行できます。例: @Repository
アノテーションと AOP を使用して例外変換を行うことができます。詳細については、Spring Framework ドキュメントの専用セクションを参照してください。
RedisConnection クラスはスレッドセーフではありません。Lettuce の StatefulRedisConnection など、基礎となるネイティブ接続はスレッドセーフである可能性がありますが、Spring Data Redis の LettuceConnection クラス自体はスレッドセーフではありません。RedisConnection のインスタンスを複数のスレッド間で共有しないでください。これは、トランザクションまたはブロッキング Redis 操作およびコマンド ( BLPOP など) に特に当てはまります。たとえば、トランザクション操作やパイプライン操作では、RedisConnection は操作を正しく完了するために保護されていない変更可能な状態を保持するため、複数のスレッドで使用するのは安全ではありません。これは仕様によるものです。 |
パフォーマンス上の理由などにより、接続などの (ステートフル) Redis リソースを複数のスレッド間で共有する必要がある場合は、ネイティブ接続を取得し、Redis クライアントライブラリ (ドライバー) API を直接使用する必要があります。あるいは、スレッドセーフな方法で操作 (および Redis コマンド) のための接続を取得および管理する RedisTemplate を使用することもできます。詳細については、RedisTemplate のドキュメントを参照してください。 |
基盤となる構成に応じて、ファクトリは新しい接続または既存の接続を返すことができます(プールまたは共有ネイティブ接続が使用されている場合)。 |
RedisConnectionFactory
を操作する最も簡単な方法は、IoC コンテナーを介して適切なコネクターを構成し、それを using クラスに挿入することです。
残念ながら、現在、すべてのコネクターがすべての Redis 機能をサポートしているわけではありません。基盤となるライブラリでサポートされていない ConnectionAPI のメソッドを呼び出すと、UnsupportedOperationException
がスローされます。次の概要では、個々の Redis コネクターでサポートされている機能について説明します。
サポートされている機能 | Lettuce | Jedis |
---|---|---|
スタンドアロン接続 | ○ | ○ |
○ | ||
マスタールックアップ、Sentinel 認証、レプリカ読み取り | マスタールックアップ | |
クラスター接続、クラスターノード接続、レプリカ読み取り | クラスター接続、クラスターノード接続 | |
輸送チャネル | TCP、OS ネイティブ TCP(epoll、kqueue)、Unix ドメインソケット | TCP |
接続プーリング | X ( | X ( |
その他の接続機能 | ノンブロッキングコマンドのシングルトン接続の共有 | パイプライン処理とトランザクションは相互に排他的です。パイプライン / トランザクションでサーバー / 接続コマンドを使用することはできません。 |
SSL サポート | ○ | ○ |
○ | ○ | |
○ | X (パイプライン処理とトランザクションは相互に排他的です) | |
○ | X (パイプライン処理とトランザクションは相互に排他的です) | |
データ型のサポート | キー、文字列、リスト、セット、並べ替えられたセット、ハッシュ、サーバー、ストリーム、スクリプト、地理、HyperLogLog | キー、文字列、リスト、セット、並べ替えられたセット、ハッシュ、サーバー、ストリーム、スクリプト、地理、HyperLogLog |
リアクティブ(ノンブロッキング)API | ○ |
Lettuce コネクターの構成
Lettuce [GitHub] (英語) は、org.springframework.data.redis.connection.lettuce
パッケージを介して Spring Data Redis によってサポートされる Netty (英語) ベースのオープンソースコネクターです。
dependencies
要素に追加します。<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.4.1.RELEASE</version>
</dependency>
</dependencies>
次の例は、新しい Lettuce 接続ファクトリを作成する方法を示しています。
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
微調整できるレタス固有の接続パラメーターもいくつかあります。デフォルトでは、LettuceConnectionFactory
によって作成されたすべての LettuceConnection
インスタンスは、すべてのノンブロッキングおよび非トランザクション操作で同じスレッドセーフなネイティブ接続を共有します。毎回専用接続を使用する場合は、shareNativeConnection
を false
に設定してください。LettuceConnectionFactory
は、shareNativeConnection
が false
に設定されている場合、ブロッキングおよびトランザクション接続またはすべての接続をプールするために LettucePool
を使用するように構成することもできます。
次の例は、LettuceClientConfigurationBuilder
を使用する、SSL やタイムアウトなどのより高度な構成を示しています。
@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.useSsl().and()
.commandTimeout(Duration.ofSeconds(2))
.shutdownTimeout(Duration.ZERO)
.build();
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379), clientConfig);
}
クライアント構成の微調整の詳細については、LettuceClientConfiguration
(Javadoc) を参照してください。
Lettuce は Netty のネイティブトランスポート (英語) と統合されているため、Unix ドメインソケットを使用して Redis と通信できます。ランタイム環境に一致する適切なネイティブトランスポートの依存関係を含めるようにしてください。次の例は、/var/run/redis.sock
で Unix ドメインソケット用の Lettuce 接続ファクトリを作成する方法を示しています。
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));
}
}
Netty は現在、OS ネイティブトランスポート用の epoll(Linux)および kqueue(BSD/macOS)インターフェースをサポートしています。 |
Jedis コネクターの構成
Jedis [GitHub] (英語) は、org.springframework.data.redis.connection.jedis
パッケージを介して Spring Data Redis モジュールによってサポートされるコミュニティ駆動型コネクターです。
dependencies
要素に追加します。<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
最も単純な形式では、Jedis の構成は次のようになります。
@Configuration
class AppConfig {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
return new JedisConnectionFactory();
}
}
ただし、本番環境で使用する場合は、次の例に示すように、ホストやパスワードなどの設定を微調整することをお勧めします。
@Configuration
class RedisConfiguration {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
return new JedisConnectionFactory(config);
}
}