Spring Data Redis は、基盤となる Jedis 実装と Lettuce 実装を切り替えます

1 はじめに

Spring Data Redis は Spring Data ファミリの一部であり、Spring アプリケーションによる Redis の簡単な構成と使用を提供します。Redis 操作の高レベルの抽象化を提供するだけでなく、Jedis と Lettuce という 2 つの接続方法もサポートします。

Redisは簡単な設定で接続でき、JedisとLettuceの2つの接続方法を切り替え可能です。まずは使い方を見てみましょう。

2回使用

2.1 Redis 依存関係の導入

Spring Boot によって提供される spring-boot-starter-data-redis 依存関係を使用します。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <version>3.1.0</version>
</dependency>

2.2 カスタム構成クラス

キーと値のシリアル化を設定するためのカスタム構成クラス。

@Configuration
public class RedisTemplateConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

2.3 Redis 接続構成の変更

構成は Spring Boot によって提供され、変更しない場合はデフォルトの構成が使用されます。シングルノード、センチネルモード、クラスターモードをサポートしており、自由に切り替えることができます。

spring:
  data:
    redis:
      host: localhost
      port: 6379
      database: 1

2.4 RedisTemplate の使用

RedisTemplateを注入すると、Redisを操作できるようになります。

RedisTemplate には 2 つのジェネリックがあります。

  • K は Redis のキー値のタイプを表し、通常は文字列タイプです。
  • V は Redis の Value 値の型を表します。V はオブジェクトにすることができます
@SpringBootTest
public class RedisTemplateTest {

    @Resource
    private RedisTemplate<String, String> redisTemplate;
    
    @Test
    public void test_set() {
        redisTemplate.opsForValue().set("test-key", "test-value");
    }
    
    @Test
    public void test_get() {
        String value = redisTemplate.opsForValue().get("test-key");
        System.out.println(value);
    }
}

3 ソースコード分析

使い方の観点から、Jedis と Lettuce のどちらを使うべきか、切り替え方法がわかりません。

3.1 Redis 自動構成クラス: RedisAutoConfiguration

Spring Boot ファミリのコンポーネントに精通している場合は、通常、その自動構成クラスである Redis 自動構成クラス RedisAutoConfiguration から始めます。

画像-20231127155643648

次の 2 つの接続 Redis 構成クラスが導入されています。

  • Lettuce の使用LettuceConnectionConfiguration
  • Jedis使用JedisConnectionConfiguration

3.2 Lettuce 接続設定クラス: LettuceConnectionConfiguration

条件付きアノテーションは、現在の構成クラスを有効にするかどうかを制御します。

  • @ConditionalOnClass: 1 つ以上のターゲット クラスを指定します。ターゲット クラスがクラス パスで見つかる場合は、現在の構成クラスが有効になります。ターゲット クラスが 1 つ見つからない限り、そのクラスは有効になりません。
  • @ConditionalOnProperty : 設定ファイルの設定項目と照合して有効にするかどうかを制御

これら 2 つの条件付きアノテーションのいずれかが有効にならない場合、現在の構成クラスは有効になりません。この構成クラスが有効になると、Lettuce 関連の依存関係を使用して、Redis 接続を取得するための RedisConnectionFactory Bean が生成されます。

package org.springframework.boot.autoconfigure.data.redis;

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisClient.class)
@ConditionalOnProperty(name = "spring.data.redis.client-type", havingValue = "lettuce", matchIfMissing = true)
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
  ...
}

io.lettuce.core.RedisClient クラスが見つかり、Lettuce 関連の依存関係が導入されたことがわかります。spring-boot-starter-data-redis には lettuce-core 依存関係があります。つまり、Spring Data Redis はデフォルトで Lettuce を使用します。

画像-20231127161706490

3.3 Jedis 接続設定クラス: JedisConnectionConfiguration

同様に、クラスパス内にJedis関連の依存クラスが存在するかどうかがチェックされます。

同様に、構成クラスが有効になった後、Jedis 関連の依存関係を使用して、Redis 接続を取得するための RedisConnectionFactory Bean が生成されます。

このクラスには、RedisConnectionFactoryBean が 1 つだけ挿入されるようにするための @ConditionalOnMissingBean アノテーションもあります。

redis.clients.jedis.Jedis クラスが見つかりません。つまり、Jedis 関連の依存関係パッケージがないため、現在の構成クラスは無効です。

3.4 接続方法をJedisに切り替える方法

方法は 2 つありますが、前提条件として、最初に Jedis 関連の依存関係を導入する必要があります。

① @ConditionalOnClass アノテーションを使用する

Lettuce の依存関係を除外し、Jedis の依存関係のみを保持します。@ConditionalOnClass アノテーションの検証に合格し、Jedis に切り替えます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

② @ConditionalOnProperty アノテーションを使用する

レタスの依存性も排除されません。つまり、これら 2 つの方法の依存性が同時に存在します。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

@ConditionalOnProperty アノテーションの検証を通じて、構成 spring.redis.client-type を jedis に設定すると、Jedis モードに切り替えることもできます。

③評価

1 つ目の利点は、不要な依存関係パッケージが読み込まれないことです。これをお勧めします。

2つ目のメリットは、設定ファイルを変更することで接続方法を自由に切り替えられることです。

この記事は、複数の記事を公開するブログOpenWriteによって公開されています。

OpenAI、ChatGPTを全ユーザーに無料公開 音声 プログラマーがETC残高を改ざんし年間260万元以上を横領 Spring Boot 3.2.0が正式リリース Google従業員が退社後の偉い人を批判 に深く関与Flutter プロジェクトと策定された HTML 関連標準 Microsoft Copilot Web AI が 12 月 1 日に正式にリリースされ、中国 Microsoft のオープンソース ターミナル チャットをサポート Rust Web フレームワーク Rocket が v0.5 をリリース: 非同期、SSE、WebSocket などを サポートRedis は、純粋な C 言語コードを使用して Telegram Bot フレームワークを実装します 。オープンソース プロジェクトのメンテナーであれば、「この種の応答にどこまで耐えることができますか?」という問題に遭遇します。 PHP 8.3 GA
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/3494859/blog/10293842