使用Spring KeyGenerator生成唯一的缓存键不起作用
当我的缓存键在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 redisTemplate(RedisConnectionFactory cf) { RedisTemplate redisTemplate = new RedisTemplate(); 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
扩展)来自定义缓存的工作方式。