gpt4 book ai didi

java-8 - Guava 缓存异步重新加载

转载 作者:行者123 更新时间:2023-12-05 07:27:52 58 4
gpt4 key购买 nike

我关注了guava cache documentation并在我的应用程序中编码异步缓存重新加载。此外,在应用程序启动期间,我使用 cache.put 加载缓存。之后我每 15 分钟重新加载一次(前提是在 15 分钟/之后有传入请求)。调试时,我发现重新加载被正确调用,我的应用程序没有等待来自数据库的更新图。

我的问题是:我是否需要继续覆盖我的应用程序中的加载方法?如上所述,缓存的初始加载是在应用程序启动时完成的。

下面是我改写的代码(与文档中的大致相同):

private LoadingCache<String, Graph> cache = CacheBuilder.newBuilder()
.refreshAfterWrite(2, TimeUnit.MINUTES)
.recordStats()
.build(new CacheLoader<String, Graph>() {
@Override
public Graph load(String key) {
return getGraphFromDB(key);
}

public ListenableFuture<Graph> reload(final String key, Graph prev) {
ListenableFutureTask<Graph> task = ListenableFutureTask.create(new Callable<Graph>() {
public Graph call() {
Graph graph = prev;
try {
graph = getGraphFromDB(key);
} catch (Exception e) {
logger.error("There was an exception when reloading the cache",e);
}
finally {
return graph;
}
}
});
executor.execute(task);
return task;
}
});

最佳答案

我认为使用asyncReloading 是个好主意。在示例中,我们重新加载缓存,每 1 分钟包含一次 PublicKeys。我们还使用 RemovalListener 进行调试。

@Value("${security.jwks-cache-refresh-milliseconds:60000}") // 1 min
private Integer jwksCacheRefreshMilliseconds;

private Cache<String, PublicKey> jwksCache;

@PostConstruct
private void init() {
TimeUnit timeUnit = TimeUnit.MILLISECONDS;

RemovalListener<String, PublicKey> removalListener = n -> {
if (n.wasEvicted() && log.isDebugEnabled()) {
log.debug("jwksCache remove key : {}, reason : {}", n.getKey(), n.getCause().name());
}
};

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);

jwksCache = CacheBuilder.newBuilder()
.refreshAfterWrite(Long.valueOf(jwksCacheRefreshMilliseconds), timeUnit)
.removalListener(removalListener)
.build(CacheLoader.asyncReloading(new CacheLoader<String, PublicKey>() {
@Override
public PublicKey load(String kid) throws Exception { // code to refresh key from jwks
}
}, scheduler));
}

关于java-8 - Guava 缓存异步重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53733479/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com