Guava Cache expireAfterWrite仅适用于getIfPresent使用?

时间:2017-01-13 22:36:24

标签: java caching ttl google-guava-cache cache-expiration

这个问题是验证观察到的行为,以确保以正确的方式使用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();

1 个答案:

答案 0 :(得分:1)

确实如果你调用get或getUnchecked,你将永远不会为null。

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

相关问题