Java 在Spring KeyGenerator不工作的情况下生成唯一缓存密钥
当我的缓存键在春季使用Java 在Spring KeyGenerator不工作的情况下生成唯一缓存密钥,java,spring,caching,spring-cache,Java,Spring,Caching,Spring Cache,当我的缓存键在春季使用@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 }
@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();
}
};
}
}
在类上的
@CacheConfig
注释中设置keyGenerator
选项也可以解决这个问题。但这似乎不必要。我遗漏了什么吗?您的配置应该实现(通常您可以从CachingConfigurerSupport
扩展)以自定义缓存的工作方式。谢谢!在我的CacheConfig
类中扩展CachingConfigurerSupport
解决了这个问题。不客气。这让我意识到我们应该更明确一点。我将看看我能做些什么来更新该领域的文档。谢谢你提出这个!StephaneNicoll我可以问一下,为什么在扩展CachingConfigure后重写该方法不足以让系统知道它必须使用哪些CacheManager和KeyGenerator实例,而我们需要用@Bean注释返回它们的方法?如果您将单个参数传递给@Cacheable
注释它被解释为要使用的缓存的名称。你真的想使用两个不同的缓存吗?
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
// do something with name
}