我这样配置了多个缓存管理器:
我这样配置了多个缓存管理器
@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 {
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
类允许您根据需要定义多个缓存规范。您可以在application.yml文件中定义缓存规范。
caching:
specs:
template:
timeout: 10
max: 10_000
daily:
timeout: 1440
max: 10_000
weekly:
timeout: 10080
max: 10_000
...:
timeout: ...
max:
然而,这个类有一个限制,我们只能设置timeout
和max
大小。因为CacheSpec
类的存在。
@Data
public class CacheSpec {
private Integer timeout;
private Integer max = 200;
}
因此,如果您想添加更多的配置参数,您需要在
CacheSpec
类上添加更多参数,并在
AppCacheConfig.buildCache
函数上设置
Cache
配置。
希望这可以帮到您!