gpt4 book ai didi

java - 使用 Spring KeyGenerator 生成唯一的缓存 key 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:31 26 4
gpt4 key购买 nike

当我的缓存键在 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 选项设置为我的 bean 的名称可以解决问题,如下所示:

@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
// do something with name
}

并且在类的 @CacheConfig 注释中设置 keyGenerator 选项也解决了这个问题。看起来这不应该是必要的。我错过了什么吗?

最佳答案

你的配置应该实现 CachingConfigurer (通常您会从 CachingConfigurerSupport 扩展)以自定义缓存的工作方式。

关于java - 使用 Spring KeyGenerator 生成唯一的缓存 key 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com