我的实现非常简单,但它没有做应该做的事情。 我正在使用这个缓存库:https://github.com/ben-manes/caffeine
当我部署应用程序时:
调用 Controller 端点 -> 第一次将数据加载到缓存(工作正常) -> 等待 10 秒 -> 刷新数据到缓存 -> 等待 10 秒 -> ...一遍又一遍
第一次加载效果很好。问题是10秒后,数据的重新加载没有运行。
Controller
MyData myData = MyData.getInstance();
Map<String, List<String>> tableOne = myData.cache.get("tableOne");
MyData 类
public LoadingCache<String, Map<String, List<String>>> cache;
public static MyData getInstance() {
if (instance == null) {
synchronized (MyData.class) {
if (instance == null) {
instance = new MyData();
}
}
}
return instance;
}
private MyData() {
this.cache = Caffeine.newBuilder()
.refreshAfterWrite(10, TimeUnit.SECONDS)
.build(key -> MyData.getInstance().loadData(key));
}
private Map<String, List<String>> loadData(String key) {
// Loads Data. This is only called once and never again!
}
知道为什么 refreshAfterWrite
不每 10 秒运行一次吗?
谢谢
最佳答案
自上次写入以来条目老化超过阈值后,读取时会触发刷新。
Automatic refreshes are performed when the first stale request for an entry occurs. The request triggering refresh will make an asynchronous call to CacheLoader.reload and immediately return the old value.
然后可以将其与过期结合起来,以便重新加载受欢迎的条目,同时不活动的条目将过期。在这种情况下,刷新可以避免调用者定期阻塞重新加载条目的损失,因为这种延迟是隐藏的,同时还确保它不会变得太陈旧。
您自己的线程可以更好地定期重新加载缓存。例如,使用 ScheduledExecutorService
可以批量重新加载所有内容。
关于java - 在 Java 中缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61911986/