1

这个问题是为了验证观察到的行为,以确保以正确的方式使用 Guava Cache。

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

使用 CacheBuilder 构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行,或任何类似的操作。

似乎只有在getIfPresent()使用方法时才会观察到过期,即当查询键时,null在一段时间后返回值 > 过期间隔在键/值被写入缓存时传递。如果使用 CacheLoader 构建的 Cache 使用get()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();
4

1 回答 1

2

确实,如果您调用 get 或 getUnchecked,您将永远不会得到 null。

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

于 2017-01-13T23:43:56.917 回答