【发布时间】:2017-01-31 11:25:28
【问题描述】:
我有一个问题。如果我使用 expireAfterAccess 并假设我的条目在 2 小时后过期。现在,如果我在一段时间后(比如 5 小时)为该条目调用 get(),它会再次被缓存吗?还是会永久过期?
private final LoadingCache<String, Map<String, PinPointRule>> pinPointRuleCache = CacheBuilder.newBuilder().maximumSize(500000)
.expireAfterAccess(2, TimeUnit.HOURS).build(new CacheLoader<String, Map<String, PinPointRule>>(){
@Override
public Map<String, PinPointRule> load(String dummyToken) throws Exception {
return loadPinPointRules(dummyToken);
}
public ListenableFuture<Map<String,PinPointRule>> reload(final String key, final Map<String,PinPointRule> oldValue) throws Exception {
ListenableFutureTask<Map<String,PinPointRule>> task = ListenableFutureTask.create(new Callable<Map<String,PinPointRule>>() {
public Map<String,PinPointRule> call() throws Exception {
long start = System.nanoTime();
LOGGER.info("LoadingCache Reload");
try {
return loadPinPointRules(key);
} catch (Exception e) {
LOGGER.error("Error while loading pinpoint rules. Returning old value. Exception :: {}", getStackTrace(e));
} finally {
LOGGER.info("Time taken in reloading pinpoint rule: {} ", TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
}
return oldValue;
}
});
executor.execute(task);
return task;
};
});
【问题讨论】:
-
它会再次被缓存(即您提供的
CacheLoader上的load方法将被调用),这就是缓存的工作方式。 -
@Xaerxess:谢谢,我无法通过文档获取此信息。
标签: java caching guava google-guava-cache