0

Lorsque j'utilise @Cacheable et que j'appelle une méthode différente avec le même paramètre, cela génère une même clé. SimpleKeyGenerator clé générée sans les noms de cache. J'utilise le spring-boot 1.3.2 avec le ressort 4.2.4.Des collisions peuvent survenir lors de l'utilisation de Spring @Cacheable et SimpleKeyGenerator

Voici un exemple:

@Component 
public static class CacheableTestClass { 

    @Cacheable(cacheNames = "test-cacheproxy-echo1") 
    public String echo1(String text) { 
     return text; 
    } 

    @Cacheable(cacheNames = "test-cacheproxy-echo2") 
    public String echo2(String text) { 
     return "Another " + text; 
    } 
} 

et exécutez un test:

assertEquals("OK", cacheableTestClass.echo1("OK")); 
assertEquals("Another OK", cacheableTestClass.echo2("OK")); // Failure: expected 'Another OK', actual 'OK'. 

Alors, est-il un moyen de résoudre ce problème? Merci beaucoup.

Mise à jour

Voici ma configuration CacheManager.

@Bean 
@ConditionalOnMissingBean(name = "cacheRedisTemplate") 
public RedisTemplate<Object, Object> cacheRedisTemplate(
     RedisConnectionFactory redisConnectionFactory) 
     throws UnknownHostException { 
    RedisTemplate<Object, Object> template = new RedisTemplate<>(); 
    template.setConnectionFactory(redisConnectionFactory); 
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); 
    template.setHashKeySerializer(template.getKeySerializer()); 
    return template; 
} 

@Bean 
public RedisCacheManager cacheManager(@Qualifier("cacheRedisTemplate") RedisTemplate<Object, Object> cacheRedisTemplate) { 
    RedisCacheManager cacheManager = new RedisCacheManager(cacheRedisTemplate); 
    cacheManager.setDefaultExpiration(
      redisCacheProperties().getDefaultExpiration()); 
    cacheManager.setExpires(redisCacheProperties().getExpires()); 
    return cacheManager; 
} 
+0

Affichez votre configuration pour le CacheManager. À partir de vos extraits de code, les clés ne doivent pas entrer en collision car vous utilisez des noms de cache différents. –

+0

@ekemchitsiga Mettre à jour ma configuration pour 'CacheManager'. – FalconIA

Répondre

2

Cela n'a rien à voir avec SimpleKeyGenerator mais cela est un problème spécifique à Redis qui n'utilise pas le nom du cache comme discriminante pour la clé qu'il utilise pour stocker la valeur.

Vous devez appeler setUsePrefix(true) sur votre RedisCacheManager. C'est ce que fait Spring Boot quand il configure automatiquement le gestionnaire de cache pour vous. Notez que cela devrait être la valeur par défaut et nous discutons de la façon dont nous pouvons améliorer l'expérience prête à l'emploi dans une future version

+0

Si je comprends bien, je suis absolument d'accord que cela devrait être le mode par défaut. De plus, je ne comprends pas alors quel est le point de 'cacheNames' si le' RedisCacheManager' les ignore – oak

+1

Il les ignore par défaut et c'était une erreur. –

+0

Merci, je ne le savais pas et j'ai eu des erreurs à cause des collisions. Maintenant, je mets '' quand j'ai créé 'RedisCacheManager' (ouais, j'utilise toujours xml :) – oak