programing

@여러 메서드 인수의 캐시 가능한 키

bestcode 2022. 11. 6. 10:31
반응형

@여러 메서드 인수의 캐시 가능한 키

스프링 매뉴얼에서 다음 순서를 수행합니다.

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

어떻게 하면@Cachable사용하다isbn그리고.checkWarehouse열쇠로?

업데이트: 현재 Spring 캐시 구현에서는 특별히 지정하지 않는 한 모든 메서드 파라미터를 캐시 키로 사용합니다.선택한 키를 사용하려면 SpEL 목록을 사용하는 Arjan의 답변을 참조하십시오.{#isbn, #includeUsed} 이것은 고유 키를 만드는 가장 간단한 방법입니다.

문서부터

기본 키 생성 전략은 Spring 4.0 릴리즈에서 변경되었습니다.이전 버전의 Spring에서는 여러 키 파라미터에 대해 파라미터의 hashCode()만을 고려했고 equals()는 고려하지 않은 키 생성 전략을 사용했습니다(배경에 대해서는 SPR-10237 참조).새로운 'SimpleKeyGenerator'는 이러한 시나리오에서 복합 키를 사용합니다.

봄 4.0 이전

Spel 식에 있는 파라미터의 값을 다음과 같은 것과 일치시키는 것을 제안합니다.key="#checkWarehouse.toString() + #isbn.toString()")org.springframework.cache.interceptor로 동작합니다.ExpressionEvaluator는 나중에 키로 사용되므로 개체를 반환할 필요가 없습니다.intSPEL 표현으로 표현합니다.

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

이 스레드의 누군가가 다음을 사용할 것을 제안했습니다.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을 참조하십시오.

정확성과 재미있는 수학/컴퓨터 과학 사실로서 덧붙이고 싶습니다.내장 해시와는 달리 MD5나 SHA256과 같은 안전한 암호화 해시 함수를 사용하는 것은 이 태스크에서는 절대적으로 가능한 일이지만, 예를 들어 Dan Boneh와 같은 함수를 매번 계산하는 것은 비용이 너무 많이 들 수 있습니다.자세한 내용은 암호화 과정을 참조하십시오.

3.할 수 있을 것 같습니다.Spring 3.2는 SpEL 입니다.{..., ..., ...}은 또한 '하다'를 포함할 수 있습니다.null가치.Spring은 목록을 실제 캐시 구현의 열쇠로 전달합니다.Ehcache 를 사용하면, 어느 시점에서 List #hash Code()기동해, 모든 항목이 고려됩니다(Ehcache 가 해시 코드에만 의존하고 있는지는 잘 모르겠습니다).

공유 캐시에 사용합니다.공유 캐시에서는 Spring 기본 키 생성기에는 포함되지 않은 메서드 이름도 키에 포함합니다.이렇게 하면 (단일) 캐시를 쉽게 삭제할 수 있습니다.다른 메서드에 일치하는 키를 너무 많이 사용하지 않아도 됩니다.예를 들어 다음과 같습니다.

@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;
    }
}

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

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

Spring SimpleKey 클래스를 사용할 수 있습니다.

@Cacheable(value = "bookCache", key = "new org.springframework.cache.interceptor.SimpleKey(#isbn, #checkWarehouse)")

이거면 될 거야

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

이것을 사용하다

@Cacheable(value="bookCache", key="#isbn + '_' + #checkWarehouse + '_' + #includeUsed")

언급URL : https://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments

반응형