我在应用程序1.5.11.RELEASE
类上使用带有@EnableCaching
的spring Configuration
创建了一个简单的sprint启动应用程序。
<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>
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
的全局规范。我错过了什么吗?也许我的用例有更合适的提供商?
答案 0 :(得分:6)
这是您唯一的机会:
@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());
}
只需将您的自定义缓存公开为bean。它们会自动添加到CaffeineCacheManager
。
答案 1 :(得分:0)
我将initial PR转换为单独的tiny project。
要开始使用它,只需从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
默认为Spring的行为。
答案 2 :(得分:0)
我这样配置多个缓存管理器
@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
类,您可以根据需要定义许多缓存规范。
您可以在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
类上添加更多的参数,并在Cache
函数上设置AppCacheConfig.buildCache
的配置。
希望有帮助!