我有一份需要被缓存的工作清单(通过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。似乎第二次调用(强制更新)没有更新缓存中的值。
如何才能实现正确的行为呢?
缓存配置(使用Caffeine):
CaffeineCache jobs = new CaffeineCache("jobs", Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)
.maximumSize(100)
.build());