1

例如:

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(),但我可以看到这会导致一些混乱。

4

1 回答 1

3

...我不清楚您是在描述您的期望还是您的观察,但invalidate应该立即删除该条目 - 而不是等待另一个查询 - 并且应该强制该值在下一个查询时重新加载到该键. 如果这不是发生的情况,那么这是一个错误。

于 2012-11-09T18:10:51.320 回答