Redis:为使用@Cacheable注释的方法设置不同的生存时间

时间:2019-06-12 14:24:55

标签: java spring spring-boot redis spring-data-redis

我有一组看起来像这样的缓存方法:

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

并且我需要为这些方法返回的对象设置不同的生存时间(失效间隔)。

问题::根据the documentation,提供的方法是在方法的返回类型上使用@RedisHash(timeToLive=…​)@TimeToLive批注。但是,我不想使用与缓存相关的逻辑来污染我的域类。另外,我的某些方法返回的字符串或无法修改的类的对象。我希望以更可配置的方式实现它。还有一个名为spring.cache.redis.time-to-live的配置属性,但是它在所有地方都应用相同的生存时间。

问题:是否可以在方法级别指定生存/失效间隔时间?还是一般来说,如何以更优雅的方式实现它?

1 个答案:

答案 0 :(得分:6)

您好,如果您只想使用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();
}

我举了最后一个例子: set expire key at specific time when using Spring caching with Redis

仅使用@Cacheable(value = "myCacheName", keyGenerator = "timeoutCacheManager")