例如:
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)
。在 invalidate()
之后立即调用 cleanUp()
似乎也没有任何效果。
我是否错误地使用了此功能,或者没有理解缓存的工作原理?
根据 http://code.google.com/p/guava-libraries/wiki/CachesExplained :
"At any time, you may explicitly invalidate cache entries rather than waiting for entries to be evicted. This can be done:
individually, using Cache.invalidate(key)"
我假设对 invalidate 的调用优先,并且始终使条目有资格被驱逐(即,下一个 getUnchecked 调用),即使时间少于 1 分钟也是如此。
编辑::我想出了我的问题。上面的观察确实是真实的,并且是缓存的预期性质。但是,我的具体问题是,当我真的需要调用不带参数的 invalidateAll() 时(这会使所有内容无效),我有时会用一个空列表调用 invalidateAll([])(这不会使任何内容无效)。我几乎期望 invalideAll([]) 等同于 invalidateAll(),但我可以看到这会导致一些困惑。
最佳答案
...我不清楚你是在描述你的期望还是你的观察,但是 invalidate
应该立即删除条目——而不是等待另一个查询——并且应该强制值重新加载该键的下一个查询。如果不是这样,那就是错误。
关于java - Guava CacheLoader - 如果同时设置了 expireAfterWrite 和 expireAfterAccess,则无效不会立即使条目无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13313533/