스프링 부트에서 카페인을 사용하여 캐시별로 다른 사양을 설정할 수 있습니까?
스프링 부트를 사용한 심플한 스프린트 부트 어플리케이션을 사용하고 있다.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();
}
}
이것.AppCacheConfig
class를 사용하면 원하는 캐시 사양을 많이 정의할 수 있습니다.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;
}
따라서 설정 파라미터를 추가할 경우 에 파라미터를 추가해야 합니다.CacheSpec
class 및 설정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
'programing' 카테고리의 다른 글
Postgre가 소개한 JSONB 설명SQL (0) | 2023.03.23 |
---|---|
시도된 가져오기 오류: 'Switch'가 'react-router-dom'에서 내보내지지 않았습니다. (0) | 2023.03.23 |
HttpPost에서 매개 변수를 사용하는 방법 (0) | 2023.03.18 |
지도 반환 시 어떻게 사용합니까? (0) | 2023.03.18 |
PLS-00428: 이 SELECT 문에 INTO 절이 필요합니다. (0) | 2023.03.18 |