@Configuration
@ConfigurationProperties(prefix = "caching")
@Data
@Slf4j
@EnableCaching
public class CacheConfiguration {
@Data
public static class CacheSpec {
private Integer timeout;
private Integer maxSize = 1024;
private Integer expireMode = ExpireMode.EXPIRE_AFTER_ACCESS.code;
}
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.debug("Cache {} specified timeout of {} second, max of {}", name, cacheSpec.getTimeout(), cacheSpec.getMaxSize());
final Caffeine<Object, Object> caffeineBuilder
= cacheSpec.expireMode == ExpireMode.EXPIRE_AFTER_ACCESS.code ?
Caffeine.newBuilder()
.expireAfterAccess(cacheSpec.getTimeout(), TimeUnit.SECONDS)
.maximumSize(cacheSpec.getMaxSize())
.ticker(ticker) :
Caffeine.newBuilder()
.expireAfterWrite(cacheSpec.getTimeout(), TimeUnit.SECONDS)
.maximumSize(cacheSpec.getMaxSize())
.ticker(ticker);
return new CaffeineCache(name, caffeineBuilder.build());
}
@Bean
public Ticker ticker() {
return Ticker.systemTicker();
}
enum ExpireMode {
EXPIRE_AFTER_WRITE(0),
EXPIRE_AFTER_ACCESS(1);
int code;
ExpireMode(int code) {
this.code = code;
}
}
}
application.properties配置
#cache config(unit:s)
caching.specs.test.timeout=120
caching.specs.test.expireMode=0