这个问题是验证观察到的行为,以确保以正确的方式使用Guava Cache。
我已经设置了两个Guava缓存(参见下面的代码):有和没有构建器 - 如Guava documentation所述:
使用CacheBuilder构建的缓存不执行清理并逐出值 “自动”,或在值到期后立即或任何其他内容 那种。
似乎仅在使用getIfPresent()
方法时观察到期,即,当查询密钥时,在一段时间后返回null
的值>到期间隔传递密钥/值被写入缓存。如果使用get()
或getUnchecked()
使用CacheLoader构建缓存,则会导致执行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();
答案 0 :(得分:1)
确实如果你调用get或getUnchecked,你将永远不会为null。
可以在性能方面“观察”到期 - 获取特定密钥需要多长时间以及是否必须进行新计算 - 以及您获得的实际值是否反映了过期信息。