例如:
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(key)“
我会假设对invalidate的调用优先,并且即使时间少于1分钟,也总是使条目符合驱逐条件(即下一次getUnchecked调用)。
编辑::我想出了我的问题。上述观察确实是真实的和缓存的预期性质。但是,我的具体问题是我有时调用带有空List的invalidateAll([])(它不会使任何东西无效),当我真的需要调用invalidateAll()时没有参数(这会使一切无效)。我几乎希望invalideAll([])等同于invalidateAll(),但我可以看到哪里会导致一些混乱。
答案 0 :(得分:3)
...我不清楚你是在描述你的期望还是你的观察,但是invalidate
应该立即删除条目 - 不等待另一个查询 - 并且应该强制重新加载该值在该密钥的下一个查询中。如果那不是发生的事情,那就是一个错误。