我正在尝试缓存一个int
值(从数据库中计算一些东西)。这个计数可能需要很长时间,我想先尝试用 200 毫秒的超时时间来做。但如果失败了,我有两种情况:
- My
cache
已填充,返回当前值并异步重新填充它。 - 未
cache
填充,通过填充来阻止并返回值。
我说的是“缓存”,但它实际上只是一个int
值,我不确定cache
这里是否需要一个完整的。我尝试过使用Guava 的供应商,但我找不到将我的特定用例与之集成的方法。
请记住,许多线程可以进入整个过程,我只希望第一个线程等待以防缓存未填充。其余的不应该等待并立即获取缓存值,如果其他线程完成重新填充缓存,则更新一个。
这是我现在拥有的示例代码:
public class CountRetriever {
private Supplier<Integer> cache = Suppliers.memoize(countSupplier());
private Supplier<Integer> countSupplier() {
return new Supplier<Integer>() {
@Override
public Integer get() {
// Do heavy count from the DB
}
};
}
public int getCount() {
try {
return submitAsyncFetch();
} catch (Exception e) {
// It takes too long, let's use the cache
return cache.get();
}
}
private Integer submitAsyncFetch() {
return executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// Do heavy count from the DB
}
}).get(200, TimeUnit.MILLISECONDS);
}
}