@여러 메서드 인수의 캐시 가능한 키
스프링 매뉴얼에서 다음 순서를 수행합니다.
@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는 나중에 키로 사용되므로 개체를 반환할 필요가 없습니다.int
SPEL 표현으로 표현합니다.
충돌 확률이 높은 해시 코드는 키로 사용할 수 없습니다.
이 스레드의 누군가가 다음을 사용할 것을 제안했습니다.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
'programing' 카테고리의 다른 글
SQL에서 열의 최대값이 있는 행만 선택 (0) | 2022.11.06 |
---|---|
MySQL에서 '존재하지 않는 경우 삽입'을 하려면 어떻게 해야 합니까? (0) | 2022.11.06 |
메서드 선언은 PHP의 상위 메서드와 호환되어야 합니다. (0) | 2022.11.06 |
JavaScript에서 변수가 숫자인지 문자열인지 확인합니다. (0) | 2022.10.27 |
리스트 통합의 람다 함수 (0) | 2022.10.27 |