복붙노트

[SPRING] Spring 캐시 캐시에 다중 캐시 관리자 구성을 갖는 방법

SPRING

Spring 캐시 캐시에 다중 캐시 관리자 구성을 갖는 방법

내 웹 응용 프로그램에서 여러 개의 스프링 캐시 관리자를 구성하려고하고 프로젝트의 여러 위치에서 다른 캐시 관리자를 사용할 수 있습니다. 이것을 할 수있는 방법이 있습니까?

해결법

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

    1.이를 수행 할 수있는 여러 가지 방법이 있으며 올바른 대답은 캐시 사용에 따라 다릅니다.

    이를 수행 할 수있는 여러 가지 방법이 있으며 올바른 대답은 캐시 사용에 따라 다릅니다.

    CacheManager A를 사용 사례의 90 %에 사용하고 B를 10 %에 사용하는 경우 A (CacheConfigurerSupport 확장을 통해 지정해야 함)와 같은 기본 CacheManager를 만드는 것이 좋습니다.

    @Configuration
    @EnableCaching
    public class CacheConfig extends CachingConfigurerSupport {
    
        @Override
        @Bean // not strictly necessary
        public CacheManager cacheManager() { ... CacheManager A }
    
        @Bean
        public CacheManager bCacheManager() { ... CacheManager B }
    }
    

    그런 다음 10 % 유스 케이스의 경우 다른 캐시 관리자를 사용해야하는 클래스의 맨 위에 CacheConfig를 추가합니다

    @CacheConfig(cacheManager="bCacheManager")
    public class MyService { /*...*/ }
    

    하나의 메소드에만 다른 캐시 관리자를 사용해야하는 경우, 메소드 레벨에서도이를 지정할 수 있습니다

    @Cacheable(cacheNames = "books", cacheManager = "bCacheManager")
    public Book findById(long id) { /*...*/ }
    

    이 상황에 있지 않다면 어떤 캐시 관리자가 사안별로 사용되어야하는지 알 수있는 방법이 필요합니다. 대상 유형 (MyService) 또는 캐시 이름 (책)을 기반으로 할 수 있습니다. 해당 번역을 수행하는 CacheResolver를 구현해야합니다.

    @Configuration
    @EnablleCaching
    public class CacheConfig extends CachingConfigurerSupport {
    
        @Override
        public CacheResolver cacheResolver() { ... }
    }
    

    자세한 내용은 CacheResolver의 javadoc을 확인하십시오. 구현시, 관리자 (manager)를 결정하기 위해 로직을 기반으로 내부적으로 호출하는 여러 CacheManager 인스턴스 (bean 또는 not)를 가질 수 있습니다.

    나는 당신이 "모듈"을 언급하고 있다는 의견을 보았습니다. 캐싱은 인프라 문제이므로 응용 프로그램 수준에서 결정을 내릴 것을 강력히 권고합니다. 캐시를 "로컬"로 태그하고 다른 태그는 "클러스터"로 태그 지정할 수 있습니다. 그러나 이름을 쉽게 이해할 수 있도록 명명법을 사용해야합니다. 모듈 수준에서 캐시 관리자를 선택하지 마십시오.

    이 블로그 게시물은 다른 예제와 함께 이것을 보여줍니다.

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

    2.@Stephane Nicoll이 설명했듯이 몇 가지 옵션이 있습니다. 커스텀 CacheResolver에 대한 정보를 제공하려고한다. CacheResolver에는 한 가지 방법이 있습니다.

    @Stephane Nicoll이 설명했듯이 몇 가지 옵션이 있습니다. 커스텀 CacheResolver에 대한 정보를 제공하려고한다. CacheResolver에는 한 가지 방법이 있습니다.

    Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context);
    

    캐시 가능한 연산의 클래스, 메소드, 인수 등에 컨텍스트를 제공합니다.

    기본적인 형태로 :

    public class CustomCacheResolver implements CacheResolver {
    
        private final CacheManager cacheManager;
    
        public CustomCacheResolver(CacheManager cacheManager){
            this.cacheManager = cacheManager;
        }
    
        @Override
        public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
            Collection<Cache> caches = getCaches(cacheManager, context);
            return caches;
        }
    
        private Collection<Cache> getCaches(CacheManager cacheManager, CacheOperationInvocationContext<?> context) {
            return context.getOperation().getCacheNames().stream()
                .map(cacheName -> cacheManager.getCache(cacheName))
                .filter(cache -> cache != null)
                .collect(Collectors.toList());
        }
    }
    

    여기에서는 간결함을 위해 하나의 CacheManager를 사용합니다. 그러나 다른 CacheManagers를 CacheResolver에 바인딩하고보다 세부적인 선택을 할 수 있습니다. 클래스 이름이 X이면 GuavaCacheManager를 사용하고, 그렇지 않으면 EhCacheCacheManager를 사용하십시오.

    이 단계가 끝나면 CacheResolver를 등록해야한다 (다시 CacheManagers를 여기에 바인딩 할 수있다).

    @Configuration
    @EnableCaching
    public class CacheConfiguration extends CachingConfigurerSupport {
    
        @Bean
        @Override
        public CacheManager cacheManager() {
            // Desired CacheManager
        }
    
        @Bean
        @Override
        public CacheResolver cacheResolver() {
            return new CustomCacheResolver(cacheManager());
        }
    }
    

    마지막 단계로 @Cacheable, @CachePut, @CacheConfig 등의 주석 중 하나에서 CustomCacheResolver를 지정해야합니다.

    @Cacheable(cacheResolver="cacheResolver")
    

    여기에서 코드 샘플을 볼 수 있습니다.

  3. from https://stackoverflow.com/questions/38570211/how-to-have-multiple-cache-manager-configuration-in-spring-cache-java by cc-by-sa and MIT license