web-dev-qa-db-ja.com

Redis:@Cacheableで注釈が付けられたメソッドの異なる存続時間を設定する

次のようなキャッシュされたメソッドのセットがあります。

_@Cacheable(value = "myCacheName", keyGenerator = "myKeyGenerator")
public Product getProduct(ProductRequest request) {
    // ...
}
_

そして、これらのメソッドによって返されるオブジェクトに対して、異なる存続時間(有効期限)を設定する必要があります。

問題:ドキュメント によると、提供されている方法は@RedisHash(timeToLive=…​)または_@TimeToLive_を使用していますメソッドの戻り型に関する注釈。ただし、キャッシュ関連のロジックでドメインクラスを汚染したくありません。さらに、一部のメソッドは、変更できない文字列またはクラスのオブジェクトを返します。私はより構成可能な方法でそれを実装したいと思います。 _spring.cache.redis.time-to-live_という設定プロパティもありますが、すべての場所で同じ存続可能時間を適用します。

質問:メソッドレベルで存続時間/有効期限の間隔を指定する方法はありますか?または一般的に、よりエレガントな方法でそれを実装する方法は?

9
Sasha Shpota

こんにちは、Springアノテーションのみを使用する場合、これを行う1つの方法は次のとおりです。 _@CacheConfig_アノテーションを使用すると、特定のCacheManagerを定義してさらに使用することができます_@Cacheable_アノテーションによりcacheManagerを定義することもできます

_@CacheConfig(cacheNames="myCacheName",cacheManager="timeoutCacheManager")
class ProductReader {

    @Cacheable(value = "myCacheName", keyGenerator = "myKeyGenerator")
   public Product getProduct(ProductRequest request) {
      // ...
   }

}


@Bean
public CacheManager timeoutCacheManager(RedisTemplate redisTemplate) {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
    cacheManager.setDefaultExpiration(mytimeToLive);
    return cacheManager;
}
_

ここにも、CacheManagerを再び生成する、より広範なキャッシュ構成の一部があります。今回は、複数のリージョンを構成します。

_@Bean (name="cacheManager")
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    RedisCacheConfiguration conf_ready_info = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMillis(50000));

    RedisCacheConfiguration conf_base_info = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMillis(60000));

    Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<String, RedisCacheConfiguration>();
    cacheConfigurations.put("base_info", conf_base_info);
    cacheConfigurations.put("ready_info", conf_ready_info);

    return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory)
            .withInitialCacheConfigurations(cacheConfigurations).build();
}
_

私は最後の例を取り上げました: RedisでSpringキャッシングを使用するときに特定の時間に期限キーを設定する

@Cacheable(value = "myCacheName", keyGenerator = "timeoutCacheManager")のみを使用する

7