我有一个需要缓存的作业列表(按ID)。但是,在某些情况下,拥有作业的最新版本很重要,并且需要绕过缓存(强制更新)。发生这种情况时,应将新获取的作业放置在缓存中。
我是这样实现的:
@Cacheable(cacheNames = "jobs",key = "#id",condition = "!#forceRefresh",sync = true)
public Job getJob(String id,boolean forceRefresh) {
// expensive fetch
}
所需行为:
-
getJob("123",false)
=>返回作业v1(如果存在,则从缓存中获取) -
getJob("123",true)
=>返回作业v2(更新版本,从数据库获取) -
getJob("123",false)
=>返回作业v2(更新的版本,从缓存中获取)
实际上,最后一次调用getJob("123",false)
返回了旧版本的作业 v1 。似乎第二次调用(强制更新)没有更新缓存中的值。
如何在此处实现正确的行为?
缓存配置(使用咖啡因):
caffeineCache jobs = new caffeineCache("jobs",caffeine.newBuilder()
.expireAfterWrite(1,TimeUnit.MINUTES)
.maximumSize(100)
.build());