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…将进行更多的测试。