Guava Cache expireAfterWrite 仅适用于使用 getIfPresent 的情况?
Guava Cache expireAfterWrite is only applicable with getIfPresent used?
这个问题是为了验证观察到的行为,以确保以正确的方式使用 Guava Cache。
我设置了两个 Guava 缓存(见下面的代码):有和没有构建器 - 正如 Guava documentation 所述:
Caches built with CacheBuilder do not perform cleanup and evict values
"automatically," or instantly after a value expires, or anything of
the sort.
似乎只有在 getIfPresent()
method is used, i.e. when a key is queried then value of null
is returned after a period of time > expiry interval passes upon key/value is written to the cache. In case of Cache built with CacheLoader using get()
or getUnchecked()
导致执行 CacheLoader.load()
方法时才会观察到过期,因此不会观察到过期,即永远不会返回 null
值。
这是正确的期望吗?
感谢您的耐心等待和帮助。
// excerpt from test code
private static final FakeTicker fakeTicker = new FakeTicker();
private static LoadingCache<Integer, String> usingCacheLoader = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.MINUTES)
.ticker(fakeTicker)
.build(new CacheLoader<Integer, String>() {
public String load(Integer keyName) throws Exception {
logger.info("Getting value for key: {}", keyName);
return getValue(keyName, "with_cache_loader");
}
});
private static Cache<Integer, String> withoutCacheLoader = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.MINUTES)
.ticker(fakeTicker)
.build();
确实,如果您调用 get 或 getUnchecked,您永远不会得到 null。
过期可以是"observed",无论是在性能方面 - 获取特定密钥需要多长时间以及是否必须重新计算它 - 以及您获得的实际值是否反映出来日期信息。
这个问题是为了验证观察到的行为,以确保以正确的方式使用 Guava Cache。
我设置了两个 Guava 缓存(见下面的代码):有和没有构建器 - 正如 Guava documentation 所述:
Caches built with CacheBuilder do not perform cleanup and evict values "automatically," or instantly after a value expires, or anything of the sort.
似乎只有在 getIfPresent()
method is used, i.e. when a key is queried then value of null
is returned after a period of time > expiry interval passes upon key/value is written to the cache. In case of Cache built with CacheLoader using get()
or getUnchecked()
导致执行 CacheLoader.load()
方法时才会观察到过期,因此不会观察到过期,即永远不会返回 null
值。
这是正确的期望吗?
感谢您的耐心等待和帮助。
// excerpt from test code
private static final FakeTicker fakeTicker = new FakeTicker();
private static LoadingCache<Integer, String> usingCacheLoader = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.MINUTES)
.ticker(fakeTicker)
.build(new CacheLoader<Integer, String>() {
public String load(Integer keyName) throws Exception {
logger.info("Getting value for key: {}", keyName);
return getValue(keyName, "with_cache_loader");
}
});
private static Cache<Integer, String> withoutCacheLoader = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.MINUTES)
.ticker(fakeTicker)
.build();
确实,如果您调用 get 或 getUnchecked,您永远不会得到 null。
过期可以是"observed",无论是在性能方面 - 获取特定密钥需要多长时间以及是否必须重新计算它 - 以及您获得的实际值是否反映出来日期信息。