programing

스프링 부트에서 카페인을 사용하여 캐시별로 다른 사양을 설정할 수 있습니까?

lastcode 2023. 3. 18. 08:41
반응형

스프링 부트에서 카페인을 사용하여 캐시별로 다른 사양을 설정할 수 있습니까?

스프링 부트를 사용한 심플한 스프린트 부트 어플리케이션을 사용하고 있다.1.5.11.RELEASE와 함께@EnableCaching응용 프로그램에서Configuration학급.

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

application.properties

spring.cache.type=caffeine
spring.cache.cache-names=cache-a,cache-b
spring.cache.caffeine.spec=maximumSize=100, expireAfterWrite=1d

질문.

질문은 간단합니다. 캐시별로 다른 크기/만료를 지정하는 방법은 무엇입니까?예: 아마도 다음 경우에 허용될 수 있습니다.cache-a유효하다1 day.그렇지만cache-b에는 괜찮을지도 모른다1 week카페인 캐시의 사양은 글로벌하게 표시됩니다.CacheManager보다는Cache.내가 뭘 빼놓았나요?사용 사례에 더 적합한 공급자가 있을까요?

이게 유일한 기회야

@Bean
public CaffeineCache cacheA() {
    return new CaffeineCache("CACHE_A",
            Caffeine.newBuilder()
                    .expireAfterAccess(1, TimeUnit.DAYS)
                    .build());
}

@Bean
public CaffeineCache cacheB() {
    return new CaffeineCache("CACHE_B",
            Caffeine.newBuilder()
                    .expireAfterWrite(7, TimeUnit.DAYS)
                    .recordStats()
                    .build());
}

커스텀 캐시를 빈으로 표시해 주세요.이것들은 자동으로 에 추가됩니다.CaffeineCacheManager.

여러 캐시 매니저를 다음과 같이 구성합니다.

@Primary
@Bean
public CacheManager template() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager(CACHE_TEMPLATE);
    cacheManager.setCaffeine(caffeineCacheBuilder(this.settings.getCacheExpiredInMinutes()));
    return cacheManager;
}

@Bean
public CacheManager daily() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager(CACHE_TEMPLATE);
    cacheManager.setCaffeine(caffeineCacheBuilder(24 * 60));
    return cacheManager;
}

그리고 캐시를 정상적으로 사용한다.

@Cacheable(cacheManager = "template")
@Override
public ArrayList<FmdModel> getData(String arg) {
    return ....;
}

갱신하다

위 코드는 큰 오류가 있는 것 같습니다.그래서 나는 로 바꿉니다.

@Configuration
@Data
@Slf4j
@ConfigurationProperties(prefix = "caching")
public class AppCacheConfig {


    //This cache spec is load from `application.yml` file
    // @ConfigurationProperties(prefix = "caching")
    private Map<String, CacheSpec> specs;

    @Bean
    public CacheManager cacheManager(Ticker ticker) {
        SimpleCacheManager manager = new SimpleCacheManager();
        if (specs != null) {
            List<CaffeineCache> caches = specs.entrySet().stream()
                    .map(entry -> buildCache(entry.getKey(), entry.getValue(), ticker)).collect(Collectors.toList());
            manager.setCaches(caches);
        }
        return manager;
    }

    private CaffeineCache buildCache(String name, CacheSpec cacheSpec, Ticker ticker) {
        log.info("Cache {} specified timeout of {} min, max of {}", name, cacheSpec.getTimeout(), cacheSpec.getMax());
        final Caffeine<Object, Object> caffeineBuilder = Caffeine.newBuilder()
                .expireAfterWrite(cacheSpec.getTimeout(), TimeUnit.MINUTES).maximumSize(cacheSpec.getMax())
                .ticker(ticker);
        return new CaffeineCache(name, caffeineBuilder.build());
    }

    @Bean
    public Ticker ticker() {
        return Ticker.systemTicker();
    }
}

이것.AppCacheConfigclass를 사용하면 원하는 캐시 사양을 많이 정의할 수 있습니다.application.yml 파일에서 캐시 사양을 정의할 수 있습니다.

caching:
  specs:
    template:
      timeout: 10 #15 minutes
      max: 10_000
    daily:
      timeout: 1440 #1 day
      max: 10_000
    weekly:
      timeout: 10080 #7 days
      max: 10_000
    ...:
      timeout: ... #in minutes
      max:
      

하지만 여전히 이 클래스는 우리가 설정할 수 있는 한계가 있다.timeout그리고.max크기만. 때문에CacheSpec학급

@Data
public class CacheSpec {

    private Integer timeout;
    private Integer max = 200;

}

따라서 설정 파라미터를 추가할 경우 에 파라미터를 추가해야 합니다.CacheSpecclass 및 설정Cache설정AppCacheConfig.buildCache기능.

도움이 되었으면 좋겠다!

는 초기 홍보를 별도의 작은 프로젝트로 전환했습니다.

사용하기 시작하려면 Maven Central의 최신 종속성을 추가하십시오.

<dependency>
    <groupId>io.github.stepio.coffee-boots</groupId>
    <artifactId>coffee-boots</artifactId>
    <version>2.0.0</version>
</dependency>

속성 형식은 다음과 같습니다.

coffee-boots.cache.spec.myCache=maximumSize=100000,expireAfterWrite=1m

특정 설정이 정의되어 있지 않은 경우,CacheManager기본적으로는 스프링의 동작입니다.

SimpleCacheManager를 사용하는 대신 CaffineCacheManager의 registerCustomCache() 메서드를 사용할 수 있습니다.다음은 예를 제시하겠습니다.

CaffeineCacheManager manager = new CaffeineCacheManager();

manager.registerCustomCache(
    "Cache1",
    Caffeine.newBuilder()
        .maximumSize(1000)
        .expireAfterAccess(6, TimeUnit.MINUTES)
        .build()
);

manager.registerCustomCache(
    "Cache2",
    Caffeine.newBuilder()
        .maximumSize(2000)
        .expireAfterAccess(12, TimeUnit.MINUTES)
        .build()
);

언급URL : https://stackoverflow.com/questions/49885064/is-it-possible-to-set-a-different-specification-per-cache-using-caffeine-in-spri

반응형