nim*_*cap 5 java caching guava
在guava中,使用LoadingCache时会同步调用CacheLoader.但是,我的load()操作可能需要很长时间(约1秒),我想采取默认操作,以防它需要太长时间(> 200毫秒)并异步加载该值.
有没有办法实现这个目标?或者您可以推荐其他方法吗?
小智 6
在咖啡因库是番石榴缓存的一个Java 8重写,使项目的异步自动加载到缓存中,返回CompletableFutures。它是由直接参与创建Guava缓存的人员编写的,并使用了受Guava启发的API(包括用于Guava接口的适配器)。
根据Guava邮件列表上的帖子,它基于Guava缓存库的原始建议,并且包括原本打算用于Guava本身的更改,但由于各种原因而未包括在内(包括Guava与旧版本兼容的更改) Java)。
实际上,有些项目现在认为不赞成使用Guava缓存,而是改用Caffeine,例如,Spring已切换到Caffeine,并且作者指出“ Caffeine是ConcurrentLinkedHashMap和Guava缓存的Java 8继承者。项目在需要JDK8或JDK8时应首选Caffeine并进行迁移。更高。”
你可能只是这样做的正常方式:提交一个任务来获得缓存值的ExecutorService,打电话get(200, MILLISECONDS)的Future,做任何其他如果超时.
例:
final LoadingCache<Key, Result> cache = ...
final Key key = ...
ExecutorService executor = ...
Future<Result> future = executor.submit(new Callable<Result>() {
@Override public Result call() throws Exception {
return cache.get(key);
}
});
try {
Result result = future.get(200, TimeUnit.MILLISECONDS);
// got the result; do stuff
} catch (TimeoutException timeout) {
// timed out; take default action
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6694 次 |
| 最近记录: |