番石榴缓存允许过时读取?

时间:2013-07-26 09:45:32

标签: java caching guava

我正在使用Guava缓存保留并定期刷新我们从长时间运行的数据库查询中收集的一些统计信息。我目前看到的问题是所有线程都必须等待刷新,而不是允许调用者获得过期的缓存值。在Guava缓存中是否有一种允许过时读取的方法?

缓存是这样构建的

 cache = CacheBuilder.<DateType, List<DataValueEventQuality>> newBuilder()
                .expireAfterWrite(cacheExpirySeconds, TimeUnit.SECONDS).build();

我使用cache.get(key, Callable)

从缓存中检索

1 个答案:

答案 0 :(得分:1)

您似乎正在使用错误的方法。从documentation for LoadingCache开始,有两种方法:

void put(K key, V value)
  

将值与此缓存中的键关联。如果以前是缓存   包含与key关联的值,旧值替换为   值。

这是原子的,缓存必须等待。

void refresh(K key)
  

加载密钥的新值,可能是异步的。而新的   值正在加载前一个值(如果有的话)将继续   由get(key)返回,除非被驱逐

您没有说明您正在使用哪种缓存或显示任何代码,因此我不知道您是否使用LoadingCache。但是你需要使用refresh来缓存重新加载仍然允许读取旧值的值。