我们需要实现几种具有不同缓存时间的方法。每个方法都用@Cacheable
注释,并且我们当前的解决方案包括在CacheManager
中设置的多个CachingConfigurerSupport
。
public class CachingConfiguration extends CachingConfigurerSupport {
@Override
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.DAYS));
return cacheManager;
}
@Bean
public CacheManager anotherCache() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES));
return cacheManager;
}
}
然后,@Cacheable
注释包括cacheManager:
@Cacheable(cacheNames =“ someCache”,cacheManager =“ anotherCache”)
基本上可以,但是如果忘记了cacheManager
等参数,也会出错。
因此,我目前正在尝试寻找更好的解决方案,但据我所知,目前尚无普遍接受的方法。
与例如,CaffeineCacheManager
的主要优势SimpleCacheManager
可以定义基本配置,然后延迟初始化其他缓存。但是,如果您能够设置从未重新初始化的其他缓存,那不是很好吗?
必须优先使用这些缓存,并在CachingConfigurerSupport
中创建它们。
也许我遗漏了一些东西,但是这不应该解决已经在多个主题中以不同形式讨论的问题吗?
答案 0 :(得分:0)
最近我决定将我的initial PR变成一个单独的tiny project。
要开始使用它,只需从Maven Central添加最新的依赖项:
<dependency>
<groupId>io.github.stepio.coffee-boots</groupId>
<artifactId>coffee-boots</artifactId>
<version>1.0.2</version>
</dependency>
属性格式如下:
coffee-boots.cache.spec.myCache=maximumSize=100000,expireAfterWrite=1m
如果未定义任何特定配置,则CacheManager
默认为Spring的行为。
答案 1 :(得分:0)
没有任何第三方库的简单方法:
spring.cache.type=caffeine
# default spec (optional)
spring.cache.caffeine.spec=maximumSize=250,expireAfterWrite=15m
# specific specs (also optional)
caffeine.specs.places=maximumSize=1000,expireAfterWrite=1h
注册自定义缓存:
applicationContext.registerBean { context ->
CacheManagerCustomizer<CaffeineCacheManager> { cacheManager ->
for (spec in Binder.get(context.environment).bindOrCreate("caffeine.specs", HashMap::class.java)) {
cacheManager.registerCustomCache(spec.key.toString(), Caffeine.from(spec.value.toString()).build())
}
}
}