[英]Generating unique cache key with Spring KeyGenerator not working
當我的緩存鍵在Spring中使用@Cacheable
注釋發生沖突時,我遇到了問題。 例如,使用以下兩種方法:
@Cacheable("doOneThing")
public void doOneThing(String name) {
// do something with name
}
@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
// do some other thing with name
}
這是我的緩存配置,其中我添加了一個keyGenerator
和一個cacheManager
bean:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object param : params) {
sb.append(param.toString());
}
return sb.toString();
}
};
}
}
由於某種原因,緩存鍵始終設置為方法中的name
參數,而不是keyGenerator.generate(..)
方法的結果,導致兩個方法都返回相同的緩存結果。
我知道我可以在每個@Cacheable
注釋上手動指定密鑰,但對於我想要緩存的每個方法來說,這似乎有點廣泛。
我注意到將@Cacheable
注釋中的keyGenerator
選項設置為my bean的名稱可以解決問題,如下所示:
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
// do something with name
}
在類上的@CacheConfig
注釋中設置keyGenerator
選項也可以解決問題。 看來這不應該是必要的。 我錯過了什么嗎?
您的配置應該實現CachingConfigurer
(通常您將從CachingConfigurerSupport
擴展)來自定義緩存的工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.