ドライバー

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 コネクターでサポートされている機能について説明します。

表 1: Redis コネクター全体での機能の可用性
サポートされている機能 LettuceJedis

スタンドアロン接続

マスター / レプリカ接続

Redis Sentinel

マスタールックアップ、Sentinel 認証、レプリカ読み取り

マスタールックアップ

Redis クラスター

クラスター接続、クラスターノード接続、レプリカ読み取り

クラスター接続、クラスターノード接続

輸送チャネル

TCP、OS ネイティブ TCP(epoll、kqueue)、Unix ドメインソケット

TCP

接続プーリング

X (commons-pool2 を使用)

X (commons-pool2 を使用)

その他の接続機能

ノンブロッキングコマンドのシングルトン接続の共有

パイプライン処理とトランザクションは相互に排他的です。パイプライン / トランザクションでサーバー / 接続コマンドを使用することはできません。

SSL サポート

Pub/Sub

パイプライン

X (パイプライン処理とトランザクションは相互に排他的です)

トランザクション

X (パイプライン処理とトランザクションは相互に排他的です)

データ型のサポート

キー、文字列、リスト、セット、並べ替えられたセット、ハッシュ、サーバー、ストリーム、スクリプト、地理、HyperLogLog

キー、文字列、リスト、セット、並べ替えられたセット、ハッシュ、サーバー、ストリーム、スクリプト、地理、HyperLogLog

リアクティブ(ノンブロッキング)API

Lettuce コネクターの構成

Lettuce [GitHub] (英語) は、org.springframework.data.redis.connection.lettuce パッケージを介して Spring Data Redis によってサポートされる Netty (英語) ベースのオープンソースコネクターです。

以下を pom.xml ファイルの 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 モジュールによってサポートされるコミュニティ駆動型コネクターです。

以下を pom.xml ファイルの 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);
  }
}