복붙노트

[SPRING] Spring KeyGenerator가 작동하지 않는 고유 한 캐시 키 생성

SPRING

Spring 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. ==============================

    1.구성시 캐싱 작동 방식을 사용자 정의하려면 CachingConfigurer (일반적으로 CachingConfigurerSupport에서 확장)를 구현해야합니다.

    구성시 캐싱 작동 방식을 사용자 정의하려면 CachingConfigurer (일반적으로 CachingConfigurerSupport에서 확장)를 구현해야합니다.

  2. from https://stackoverflow.com/questions/27574786/generating-unique-cache-key-with-spring-keygenerator-not-working by cc-by-sa and MIT license