SpringBoot 2.x redisをキャッシュに統合


SpringBoot 2.x redisをキャッシュに統合


SpringBoot 2.0は今年3月に正式に発表され、同社の新プロジェクトではSpringBoot 2.0が使用され、1.0よりも多くの変更が行われた.SpringBootは2.0からjdk 1をサポートしない.8以下のバージョン、jdk 1.8に導入されたdefaultキーワードは、インタフェースがメソッドのデフォルト実装を提供することができるようにし、SpringBoot 2.0ではこの特性が大量に使用されているため、1.0から2.0に移行したばかりのとき、多くのクラスが期限切れ(deprecated)を提示する.1.0でSpringBootは抽象クラスを使用してインタフェースメソッドのデフォルト実装を提供し、ユーザーは使用時にこの抽象クラスを継承し、自分の機能を実現する必要があるからである.2.0に更新すると、抽象クラスを継承する必要がなく、あるインタフェースを直接実現し、自分の必要な方法を書き換えることができます.

一、redisの関連構成


1.spring-redisの導入依存
まずmavenを用いてspring-redis関連依存を導入し,2.0ではspring-boot-starter-data-redisを用いて従来のspring-boot-starter-redisに代わった
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

2.redisデータベースの構成
SpringBootのアプリケーションでymlプロファイルにおけるredisデータベースの構成に関する情報は、springのような時間依存属性の2つが主に変更されている.redis.timeout,1.0では時間依存の構成パラメータタイプがint,デフォルト単位がミリ秒であり,構成では具体的な数字を指定するだけでよいが,2.0では時間依存の構成パラメータタイプはjdk 1に変更される.8のDurationなので、プロファイルにredisの接続タイムアウト時間timeoutを設定する場合、60 sなどの時間単位を加える必要があります.2つ目は、redisの接続プール情報を2.0に配置する際にspringを使用しないことである.redis.poolのプロパティではなく、redisのlettuceクライアントまたはjedisクライアントを直接使用して構成されます.具体的な構成情報は次のとおりです.
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    timeout: 60s  #          ,2.0         Duration,              
    #      ,2.0     jedis  lettuce     
    jedis:
      pool:
        #        
        max-idle: 500
        #        
        min-idle: 50
        #            ,      
        max-wait:  -1s
        #        ,      
        max-active: -1

3、CacheManagerの構成
SpringのCacheManagerをredisに設定することで、redisをキャッシュに使用することを指定できます.具体的な構成方法は1.0と異なり、1.0ではRedisTemplateを使用してRedisCacheManagerをインスタンス化できます.RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);2.0でこのコンストラクタを削除しました.また、以前のsetDefaultExpirationメソッドでデフォルトのキャッシュ有効期限を設定することはできません.新しいバージョンでは、次の2つの方法でRedisCacheManagerを構築できます.
  • RedisCacheManagerによる静的方法create:
  • @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(factory);
        return cacheManager;
    }

    このようにして生成されたcacheManagerはSpringで提供されたデフォルト構成のみを使用します.
  • Springが提供するRedisCacheConfigurationクラスにより、独自のredis構成クラスを構築する.この構成クラスから初期化されたキャッシュネーミングスペースや、対応するデフォルトの有効期限などの属性を設定し、RedisCacheManagerのbuilderを再利用することができる.ビルド()方式生成cacheManager:
  • @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();  //         ,  config              
        config = config.entryTtl(Duration.ofMinutes(1))     //            ,    Duration  
                .disableCachingNullValues();     //      
    
        //             set  
        Set cacheNames =  new HashSet<>();
        cacheNames.add("my-redis-cache1");
        cacheNames.add("my-redis-cache2");
    
        //               
        Map configMap = new HashMap<>();
        configMap.put("my-redis-cache1", config);
        configMap.put("my-redis-cache2", config.entryTtl(Duration.ofSeconds(120)));
    
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)     //                cacheManager
                .initialCacheNames(cacheNames)  //           ,                  ,         
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }

    キャッシュ構成をカスタマイズする場合は注意が必要ですが、RedisCacheConfigurationで構成キャッシュを設定する方法はすべて戻り値があり、configオブジェクトに値を再割り当てする必要があります.最初はそれに気づかなかったとき、どのように設定しても機能しないことに気づきました.ここでは、キャッシュ時間を設定する方法entryTtlなどのソースコードを見てみましょう.
    /**
     *Set the ttl to apply for cache entries. Use {@link Duration#ZERO} to declare an eternal cache.
     *
     * @param ttl must not be {@literal null}.
     * @return new {@link RedisCacheConfiguration}.
     */
    public RedisCacheConfiguration entryTtl(Duration ttl) {
    
        Assert.notNull(ttl, "TTL duration must not be null!");
        //   return     RedisCacheConfiguration  ,RedisCacheConfiguration     final   
        return new RedisCacheConfiguration(ttl, cacheNullValues, usePrefix, keyPrefix, keySerializationPair,
                valueSerializationPair, conversionService);
    }

    デフォルトの構成を見てみましょう.デフォルトのキャッシュ時間とシーケンス化に関する構成が含まれています.
    public static RedisCacheConfiguration defaultCacheConfig() {
    
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
    
        registerDefaultConverters(conversionService);
    
        return new RedisCacheConfiguration(Duration.ZERO, true, true, CacheKeyPrefix.simple(),
                SerializationPair.fromSerializer(new StringRedisSerializer()),
                SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()), conversionService);
    }

    ここまで1.0から2.0に更新すると、redisキャッシュに関する構成が悪くなりません.残りの方法もあまり多くありません.興味があれば、自分でテストしてみてください.の