Guava Cache expireAfterWrite仅适用于使用getIfPresent的情况



这个问题是为了验证观察到的行为,以确保以正确的方式使用番石榴缓存。

我已经设置了两个番石榴缓存(见下面的代码):有和没有构建器 - 正如番石榴文档所述:

使用 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();

确实,如果您调用 get 或 getUncheck,您将永远不会获得空值。

过期可以在性能方面"观察"(获取特定密钥需要多长时间以及是否必须重新计算)以及您获得的实际值是否反映了可能过时的信息。

相关内容

  • 没有找到相关文章

最新更新