Redis: установите другое время жизни для методов, аннотированных @Cacheable - PullRequest
9 голосов
/ 12 июня 2019

У меня есть набор кэшированных методов, которые выглядят примерно так:

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

И мне нужно установить другое время жизни (интервал истечения) для объектов, возвращаемых этими методами.

Проблема: Согласно документации , предлагается использовать аннотации @RedisHash(timeToLive=…​) или @TimeToLive для типа возврата методов.Однако я не хочу загрязнять свои доменные классы логикой, связанной с кэшированием.Кроме того, некоторые из моих методов возвращают строки или объекты классов, которые я не могу изменить.Я бы предпочел реализовать это более настраиваемым способом.Существует также свойство конфигурации с именем spring.cache.redis.time-to-live, но оно применяется к одному и тому же времени жизни во всех местах.

Вопрос: Есть ли способ указать время жизни / истечения срока действияинтервал на уровне метода?Или вообще, как это реализовать более элегантно?

1 Ответ

6 голосов
/ 17 июня 2019

Привет, если вы хотите использовать только аннотации Spring, один из способов сделать это заключается в следующем. @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();
}

Я взял последний пример из: установить ключ истечения в определенное время при использовании Spring кэширования с Redis

Использование только @Cacheable(value = "myCacheName", keyGenerator = "timeoutCacheManager")

...