@Cacheable
注釈を使用してSpringでキャッシュキーが衝突しているときに問題が発生しています。たとえば、次の 2 つの方法を使用します。
@Cacheable("doOneThing")
public void doOneThing(String name) {
// do something with name
}
@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
// do some other thing with name
}
これが私のキャッシュ構成で、 akeyGenerator
と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
キャッシュしたいすべてのメソッドについては少し広範に思えます。
編集
keyGenerator
注釈内のオプションを@Cacheable
Bean の名前に設定すると、次のように問題が解決することに気付きました。
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
// do something with name
}
また、クラスの注釈にkeyGenerator
オプションを設定すると、問題も解決します。@CacheConfig
ただし、これは必要ではないようです。何か不足していますか?