복붙노트

[SPRING] 배열이나 콜렉션 매개 변수를 취하는 메소드에서 Spring Cache를 사용하기위한 전략은 무엇입니까?

SPRING

배열이나 콜렉션 매개 변수를 취하는 메소드에서 Spring Cache를 사용하기위한 전략은 무엇입니까?

Spring의 Cache 추상화를 사용하여 메소드에 @Cacheable로 주석을 달기를 원합니다. 그러나 일부 메서드는 매개 변수의 배열 또는 컬렉션을 가져 와서 컬렉션을 반환하도록 디자인되었습니다. 예를 들어,이 메소드를 사용하여 엔티티를 찾을 수 있습니다.

public Collection<Entity> getEntities(Collection<Long> ids)

의미 상으로, 전체적으로 ID 컬렉션을 기반으로하지 않고 Entity 객체를 개별적으로 캐시해야합니다 (ID로 키 처리). 이 질문에 대한 질문과 비슷합니다.

간단한 Spring Memcached는 ReadThroughMultiCache를 통해 원하는 것을 지원하지만 memcached가 아닌 캐시 저장소 구현 (Guava, Coherence, Hazelcast 등)을 쉽게 변경할 수 있도록 Spring의 추상화를 사용하고자합니다.

Spring Cache를 사용하여 이런 종류의 메소드를 캐시하기위한 전략은 무엇입니까?

해결법

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

    1.Spring의 Cache Abstraction은 out-of-the-box에서이 동작을 지원하지 않습니다. 그러나 이것이 가능하지 않다는 것을 의미하지는 않습니다. 원하는 동작을 지원하기 위해 조금 더 많은 작업이 필요합니다.

    Spring의 Cache Abstraction은 out-of-the-box에서이 동작을 지원하지 않습니다. 그러나 이것이 가능하지 않다는 것을 의미하지는 않습니다. 원하는 동작을 지원하기 위해 조금 더 많은 작업이 필요합니다.

    나는 개발자가 이것을 어떻게 달성 할 수 있는지 보여주는 작은 예제를 썼다. 이 예제는 Spring의 ConcurrentMapCacheManager를 사용하여 사용자 정의를 보여줍니다. 이 예제는 원하는 캐싱 제공자 (예 : Hazelcast, Coherence 등)에 맞게 조정해야합니다.

    즉, 캐시를 "장식"하기 위해 CacheManager 구현의 메소드를 대체해야합니다. 이것은 구현마다 다릅니다. ConcurrentMapCacheManager에서, 메소드는 createConcurrentMapCache (name : String)입니다. Spring Data GemFire에서는 getCache (name : String) 메소드를 오버라이드하여 리턴 된 Cache를 꾸미게된다. Guava의 경우 GuavaCacheManager의 createGuavaCache (name : String)가됩니다.

    그런 다음 커스터마이징 된 데코 레이팅 된 캐시 구현 (이상적으로는 실제 캐시 임 플리먼트로 위임)은 키 및 해당 값의 콜렉션 캐싱을 처리합니다.

    이 방법에는 몇 가지 제한 사항이 있습니다.

    어쨌든이 상황을 제대로 처리하는 방법에 대한 통찰력을 제공하기를 바랍니다.

    테스트 클래스는 자체 포함 (스프링 JavaConfig 사용)하며 별도의 종속성없이 실행할 수 있습니다 (Spring, JUnit 및 JRE 제외).

    건배!

  2. from https://stackoverflow.com/questions/33657881/what-strategies-exist-for-using-spring-cache-on-methods-that-take-an-array-or-co by cc-by-sa and MIT license