例如:
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()
right afterinvalidate()
似乎也没有效果。
我是在错误地使用此功能还是不了解缓存的工作原理?
根据http://code.google.com/p/guava-libraries/wiki/CachesExplained:
“在任何时候,您都可以显式地使缓存条目无效,而不是等待条目被驱逐。这可以做到:
单独使用 Cache.invalidate(key)"
我会假设调用 invalidate 将优先并且总是使条目有资格被驱逐(即,下一个 getUnchecked 调用),即使时间少于 1 分钟。
编辑:: 我想出了我的问题。上面的观察确实是真实的并且是缓存的预期性质。但是,我的具体问题是,当我真的需要在没有参数的情况下调用 invalidateAll() 时(这会使所有内容无效),我有时会使用空列表(这不会使任何内容无效)调用 invalidateAll([])。我几乎希望 invalideAll([]) 等同于 invalidateAll(),但我可以看到这会导致一些混乱。