java - Guava CacheLoader - 如果同时设置了 expireAfterWrite 和 expireAfterAccess,则无效不会立即使条目无效

标签 java guava

例如:

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/

相关文章:

java - 验证项目是否在开始日期和结束日期内

java - 使用 Java/Guava Optional<T> 类创建和处理对象矩阵

java - Google Collections API 是否具有与 Ruby Enumerable#inject 方法等效的方法?

java - 为什么 softKeys() 在 Guava 10 中被弃用?

java - 如何在JAVA(ResultSet)中检查合并查询是否成功?

java - 将对象上传到 Google Cloud Storage

java - 如何避免用空值覆盖非空值?

java - 让 AlertDialog 等待用户输入?

java.lang.NoClassDefFoundError : com/google/common/base/internal/Finalizer$ShutDown (wrong name: com/google/common/base/internal/Finalizer)

java - Java 中的多集交集操作