我有一个需要缓存的作业列表(按 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());