所以不会立即失效条目:番石榴的CacheLoader - 无效如果两个expireAfterWrite和expireAfterAccess被例如设置
CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterAccess(1, TimeUnit.MINUTES)
.expireAfterWrite(1, TimeUnit.MINUTES)
.build(new CacheLoader<String, Object>() {
@Override
public Object load (String key) {
return ...;
}
});
如果在返回的实例调用invalidate(key)
,以getUnchecked()
的后续调用将始终使用以前的值,直到至少1分钟过去了,因为它会再次呼叫load(key)
。拨打cleanUp()
后invalidate()
似乎也没有效果。
我是否正确使用此功能或不理解缓存的工作原理?
每http://code.google.com/p/guava-libraries/wiki/CachesExplained:
“在任何时候,你可以明确地无效缓存条目,而不是等待条目被拆迁户可以这样做:
单独使用Cache.invalidate(关键)“
我会假设对invalidate的调用将优先,并且总是使条目有资格驱逐(即,下一次getUnchecked调用),即使时间少于1 minu TE。
编辑::我想通了我的问题。上述观察确实是真实的,并且是缓存的预期性质。然而,我的具体问题是,当我真的需要在不带任何参数的情况下调用invalidateAll()(这会使所有内容无效)时,我有时会调用invalidateAll([])一个空List(它不会使任何内容无效)。我几乎期望invalideAll([])等价于invalidateAll(),但我可以看到哪里会导致一些混淆。
我认为这是一个实际的应用程序级别的缺陷,我可能太快责怪LoadingCache ...会做更多的测试。 – GreenieMeanie