복붙노트

[SPRING] 여러 메소드 인수에 @Cacheable 키

SPRING

여러 메소드 인수에 @Cacheable 키

봄 문서에서 :

@Cacheable(value="bookCache", key="isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@Cachable을 지정하여 isbn 및 checkWarehouse를 키로 사용하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.업데이트 : 현재 Spring 캐시 구현은 달리 지정되지 않은 경우 모든 메소드 매개 변수를 캐시 키로 사용합니다. 선택한 키를 사용하려면 고유 키를 만드는 가장 간단한 방법 인 SpEL list {#isbn, #includeUsed}를 사용하는 Arjan의 대답을 참조하십시오.

    업데이트 : 현재 Spring 캐시 구현은 달리 지정되지 않은 경우 모든 메소드 매개 변수를 캐시 키로 사용합니다. 선택한 키를 사용하려면 고유 키를 만드는 가장 간단한 방법 인 SpEL list {#isbn, #includeUsed}를 사용하는 Arjan의 대답을 참조하십시오.

    스프링 문서

    봄 4.0 이전

    나는 당신이 key = "# checkWarehouse.toString () + # isbn.toString ()"과 같은 것으로 Spel 표현식에서 매개 변수의 값을 concat하는 것을 제안한다. 이것은 org.springframework.cache.interceptor.ExpressionEvaluator로 작동해야한다고 생각한다. 나중에 키로 사용되는 Object를 반환하므로 SPEL 표현식에 int를 제공 할 필요가 없습니다.

    충돌 확률이 높은 해시 코드는 키로 사용할 수 없습니다.

    이 스레드의 누군가는 T (java.util.Objects) .hash (# p0, # p1, # p2)를 사용하도록 제안했으나 작동하지 않을 것입니다.이 접근법은 쉽지 않습니다. 예를 들어, SPR-9377 :

        System.out.println( Objects.hash("someisbn", new Integer(109), new Integer(434)));
        System.out.println( Objects.hash("someisbn", new Integer(110), new Integer(403)));
    

    두 줄 모두 내 환경에 -636517714를 인쇄합니다.

    추신 실제로 참조 문서에서

    @Cacheable(value="books", key="T(someType).hash(#isbn)") 
    public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
    

    필자는이 예제가 잘못되었다고 오해의 소지가 있으며, 키가 고유해야하므로 문서에서 제거해야한다고 생각합니다.

    P.P.S. 또한 기본 키 생성에 관한 몇 가지 흥미로운 아이디어는 https://jira.springsource.org/browse/SPR-9036을 참조하십시오.

    SHA256과 같은 보안 암호화 해시 함수를 사용하는 것이 이러한 작업의 속성으로 인해 가능하지만 매번 계산할 때 값이 비싸지 만 정확함을 기하기 위해 추가하고 싶습니다.

  2. ==============================

    2.Spring 3.2의 제한된 테스트를 거친 후에는 {..., ...,}} SpEL 목록을 사용할 수있는 것 같습니다. null 값을 포함 할 수도 있습니다. Spring은 목록을 실제 캐시 구현의 핵심으로 전달합니다. Ehcache를 사용할 때 어떤 점에서 그러한 항목은 List # hashCode ()를 호출합니다.이 항목은 모든 항목을 고려합니다. (Ehcache가 해시 코드에만 의존하는지 잘 모르겠다.)

    Spring 3.2의 제한된 테스트를 거친 후에는 {..., ...,}} SpEL 목록을 사용할 수있는 것 같습니다. null 값을 포함 할 수도 있습니다. Spring은 목록을 실제 캐시 구현의 핵심으로 전달합니다. Ehcache를 사용할 때 어떤 점에서 그러한 항목은 List # hashCode ()를 호출합니다.이 항목은 모든 항목을 고려합니다. (Ehcache가 해시 코드에만 의존하는지 잘 모르겠다.)

    이 키를 공유 캐시에 사용합니다. 여기에는 스프링 기본 키 생성기에 포함되지 않은 키에 메서드 이름도 포함됩니다. 이 방법을 사용하면 다른 방법에 대해 일치하는 키를 위험에 빠뜨리지 않고도 (단일) 캐시를 쉽게 지울 수 있습니다. 처럼:

    @Cacheable(value="bookCache", 
      key="{ #root.methodName, #isbn?.id, #checkWarehouse }")
    public Book findBook(ISBN isbn, boolean checkWarehouse) 
    ...
    
    @Cacheable(value="bookCache", 
      key="{ #root.methodName, #asin, #checkWarehouse }")
    public Book findBookByAmazonId(String asin, boolean checkWarehouse)
    ...
    

    물론, 많은 메소드가 이것을 필요로하고 당신이 항상 당신의 키에 대한 모든 파라미터를 사용한다면, 클래스와 메소드 이름을 포함하는 커스텀 키 생성기를 정의 할 수 있습니다 :

    <cache:annotation-driven mode="..." key-generator="cacheKeyGenerator" />
    <bean id="cacheKeyGenerator" class="net.example.cache.CacheKeyGenerator" />
    

    ...와:

    public class CacheKeyGenerator 
      implements org.springframework.cache.interceptor.KeyGenerator {
    
        @Override
        public Object generate(final Object target, final Method method, 
          final Object... params) {
    
            final List<Object> key = new ArrayList<>();
            key.add(method.getDeclaringClass().getName());
            key.add(method.getName());
    
            for (final Object o : params) {
                key.add(o);
            }
            return key;
        }
    }
    
  3. ==============================

    3.예를 들어 JDK 1.7에서 Spring-EL 식을 사용할 수있다.

    예를 들어 JDK 1.7에서 Spring-EL 식을 사용할 수있다.

    @Cacheable(value="bookCache", key="T(java.util.Objects).hash(#p0,#p1, #p2)")
    
  4. ==============================

    4.이것은 효과가있다.

    이것은 효과가있다.

    @Cacheable (value = "bookCache", key = "# checkwarehouse.toString (). append (# isbn.toString ())")

  5. ==============================

    5.이것을 사용하십시오

    이것을 사용하십시오

    @Cacheable(value="bookCache", key="isbn + '_' + checkWarehouse + '_' + includeUsed")
    
  6. from https://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments by cc-by-sa and MIT license