问题描述
我需要在服务中使用多个缓存以用于不同的用途。 我正在寻找一种方法来分隔其配置,例如 maximumSize 和 expireAfterWrite 。 我正在使用Spring和Kubernetes,在deploy.yaml中,我有这个:
spring:
main:
allow-bean-deFinition-overriding: true
cache:
type: caffeine
cache-names: cacheA,cacheB
caffeine:
spec: expireAfterWrite=1h,maximumSize=2000
output:
ansi:
enabled: never
我想创建一个新的缓存 cacheC ,它将具有不同的配置。
我该怎么做?谢谢!
解决方法
您可以以编程方式声明许多缓存配置,而不是使用yaml。
类似这样的东西:
@Configuration
@EnableCaching
public class CacheConfig {
public static final String CACHE_A = "cacheA";
public static final String CACHE_B = "cacheB";
public static final String CACHE_C = "cacheC";
@Bean
public CacheManager cacheManagerTicker(Ticker ticker) {
List<Cache> caches = new ArrayList<>();
// Cache A
caches.add(this.buildCache(CACHE_A,ticker,2000L,1L,TimeUnit.HOURS));
// Cache B
caches.add(this.buildCache(CACHE_B,TimeUnit.HOURS));
// Cache C
caches.add(this.buildCache(CACHE_C,3500L,15L,TimeUnit.MINUTES));
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(caches);
return cacheManager;
}
private CaffeineCache buildCache(String cacheName,Ticker ticker,Long maxSize,Long ttl,TimeUnit ttlUnit){
Caffeine<Object,Object> cacheBuilder = Caffeine.newBuilder();
// TTL
if (ttl != null && ttl > 0 && ttlUnit != null){
cacheBuilder.expireAfterWrite(ttl,ttlUnit);
}
// Max size
if (maxSize != null && maxSize > 0){
cacheBuilder.maximumSize(maxSize);
}
// Ticker
cacheBuilder.ticker(ticker);
return new CaffeineCache(cacheName,cacheBuilder.build());
}
@Bean
public Ticker ticker() {
return Ticker.systemTicker();
}
}