[SPRING] Spring KeyGenerator가 작동하지 않는 고유 한 캐시 키 생성
SPRINGSpring KeyGenerator가 작동하지 않는 고유 한 캐시 키 생성
캐시 키가 @Cacheable 주석을 사용하여 Spring에서 충돌 할 때이 문제가 발생합니다. 예를 들어 다음 두 가지 방법을 사용합니다.
@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 빈을 추가 한 캐시 구성입니다.
@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();
}
};
}
}
어떤 이유로 캐시 키는 항상 keyGenerator.generate (..) 메소드의 결과가 아닌 메소드의 name 매개 변수로 설정되므로 두 메소드가 동일한 캐시 결과를 리턴합니다.
각 @Cacheable 어노테이션에 키를 수동으로 지정할 수 있다는 것을 알고 있지만 캐시하고 싶은 모든 메소드에 대해 조금 광범위하게 보입니다.
나는 bean의 이름에 @Cacheable 주석 안에 keyGenerator 옵션을 설정하는 것이 문제를 해결한다는 것을 알아 냈다.
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
// do something with name
}
또한 클래스의 @CacheConfig 주석에서 keyGenerator 옵션을 설정하면 문제가 해결됩니다. 이것은 필요하지 않아야하는 것으로 보인다. 내가 놓친 게 있니?
해결법
-
==============================
1.구성시 캐싱 작동 방식을 사용자 정의하려면 CachingConfigurer (일반적으로 CachingConfigurerSupport에서 확장)를 구현해야합니다.
구성시 캐싱 작동 방식을 사용자 정의하려면 CachingConfigurer (일반적으로 CachingConfigurerSupport에서 확장)를 구현해야합니다.
from https://stackoverflow.com/questions/27574786/generating-unique-cache-key-with-spring-keygenerator-not-working by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] ssl을 사용하는 Spring 5 WebClient (0) | 2019.03.28 |
---|---|
[SPRING] MySQL 용 Spring Batch 3 업그레이드 스크립트가 있습니까? (0) | 2019.03.28 |
[SPRING] 스프링 3.x로 https 사이트를 개발하는 방법은? (0) | 2019.03.28 |
[SPRING] 봄 부팅 ddl 자동 발전기 (0) | 2019.03.28 |
[SPRING] 수동으로 AuthenticationManager 인스턴스 가져 오기 (0) | 2019.03.28 |