fik*_*tra 3 spring caching spring-boot spring-cache caffeine
我有一个需要缓存的作业列表(按 id)。然而,在某些情况下,拥有最新版本的作业很重要,并且需要绕过缓存(强制更新)。发生这种情况时,新获取的作业应放置在缓存中。
我是这样实现的:
@Cacheable(cacheNames = "jobs", key = "#id", condition = "!#forceRefresh", sync = true)
public Job getJob(String id, boolean forceRefresh) {
// expensive fetch
}
Run Code Online (Sandbox Code Playgroud)
期望的行为:
getJob("123", false) => 返回作业 v1(如果存在,则从缓存中获取)getJob("123", true) => 返回作业 v2(更新版本,从数据库中获取)getJob("123", false)=> 返回作业 v2(更新版本,从缓存中获取)实际上,最后一次调用getJob("123", false)返回 job v1,即陈旧版本。似乎第二次调用(强制更新)不会更新缓存中的值。
我怎样才能在这里实现正确的行为?
缓存配置(使用咖啡因):
CaffeineCache jobs = new CaffeineCache("jobs", Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)
.maximumSize(100)
.build());
Run Code Online (Sandbox Code Playgroud)
如果forceRefresh为真,则不会因为条件而激活 Spring 缓存condition = "!#forceRefresh"。因此,缓存值不会更新。
您需要明确告诉 Spring 更新缓存值,@CachePut以防万一forceRefresh:
@Caching(
cacheable = {@Cacheable(cacheNames = "jobs", key = "#id", condition = "!#forceRefresh")},
put = {@CachePut(cacheNames = "jobs", key = "#id", condition = "#forceRefresh")}
)
public Job getJob(String id, boolean forceRefresh) {
// expensive fetch
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1153 次 |
| 最近记录: |