Java Guava CacheLoader-如果同时设置了expireAfterWrite和expireAfterAccess,则invalidate不会立即使条目无效
例如:Java Guava CacheLoader-如果同时设置了expireAfterWrite和expireAfterAccess,则invalidate不会立即使条目无效,java,guava,Java,Guava,例如: CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterAccess(1, TimeUnit.MINUTES) .expireAfterWrite(1, TimeUnit.MINUTES) .build(new CacheLoader<String, Object>() { @Override
CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterAccess(1, TimeUnit.MINUTES)
.expireAfterWrite(1, TimeUnit.MINUTES)
.build(new CacheLoader<String, Object>() {
@Override
public Object load (String key) {
return ...;
}
});
CacheBuilder.newBuilder()
.最大尺寸(1000)
.expireAfterAccess(1,时间单位:分钟)
.expireAfterWrite(1,时间单位为分钟)
.build(新的缓存加载程序(){
@凌驾
公共对象加载(字符串键){
返回。。。;
}
});
如果对返回的实例调用invalidate(key)
,则对getUnchecked()
的后续调用将始终使用上一个值,直到至少1分钟过去,因为它将再次调用load(key)
。在invalidate()
之后调用cleanUp()
似乎也没有效果
我是否错误地使用了此功能,或者不了解缓存是如何工作的
Per:
“在任何时候,您都可以显式地使缓存项无效,而不是等待项被逐出。可以这样做:
单独使用缓存。无效(密钥)”
我假设调用invalidate将优先,并且始终使条目符合驱逐条件(即,下一个getUnchecked调用),即使时间少于1分钟
我解决了我的问题。上述观察结果确实正确,并且符合缓存的预期性质。然而,我的具体问题是,有时我使用空列表调用invalidateAll([])(这不会使任何内容无效),而实际上我需要调用不带参数的invalidateAll()(这会使所有内容无效)。我几乎希望invalideAll([])等同于invalideAll(),但我可以看出这会导致一些混乱。…我不清楚您是在描述您的期望还是您的观察结果,但是,
invalidate
应该立即删除该条目,而不是等待另一个查询,并且应该强制在下一个查询中重新加载该键的值。如果不是这样的话,那就是一个bug。我认为这是一个实际的应用程序级缺陷,我可能会很快地责怪LoadingCache…将进行更多的测试。