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

Sas*_*ota 9 java spring redis spring-data-redis spring-boot

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

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

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

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

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

Ale*_*rov 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;
}
Run Code Online (Sandbox Code Playgroud)

这也是更广泛的缓存配置的一部分,再次导致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();
}
Run Code Online (Sandbox Code Playgroud)

我从以下示例中获取了最后一个示例: 在将Redis缓存与Spring一起使用时,在特定时间设置expire key

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