web-dev-qa-db-fra.com

Redis: définir une durée de vie différente pour les méthodes annotées avec @Cacheable

J'ai un ensemble de méthodes mises en cache qui ressemblent un peu à ceci:

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

Et je dois définir une durée de vie différente (intervalle d'expiration) pour les objets renvoyés par ces méthodes.

Problème: Selon la documentation , la méthode proposée utilise @RedisHash(timeToLive=…​) ou @TimeToLive annotations sur le type de retour des méthodes. Cependant, je ne veux pas polluer mes classes de domaine avec une logique liée à la mise en cache. De plus, certaines de mes méthodes retournent des chaînes ou des objets de classes que je ne peux pas modifier. Je préférerais l'implémenter de manière plus configurable. Il existe également une propriété de configuration appelée spring.cache.redis.time-to-live, Mais elle applique la même durée de vie à tous les endroits.

Question: Existe-t-il un moyen de spécifier la durée de vie/l'intervalle d'expiration au niveau de la méthode? Ou généralement, comment l'implémenter de manière plus élégante?

9
Sasha Shpota

Bonjour, si vous souhaitez utiliser uniquement les annotations Spring, vous pouvez procéder comme suit. L'annotation @CacheConfig Vous permet de définir un CacheManager spécifique pour utiliser davantage l'annotation @Cacheable Permet également de définir 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;
}

Voici également un fragment d'une configuration de cache plus étendue qui se traduit à nouveau par un CacheManager. Cette fois, il configure plusieurs régions:

@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();
}

J'ai pris le dernier exemple de: définir la clé d'expiration à un moment précis lors de l'utilisation de la mise en cache Spring avec Redis

Utiliser uniquement @Cacheable(value = "myCacheName", keyGenerator = "timeoutCacheManager")

7
Alexandar Petrov