java - 在 Java 中缓存数据

标签 java caffeine

我的实现非常简单,但它没有做应该做的事情。 我正在使用这个缓存库: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/

相关文章:

java - 无法从 Throwable 转换为 MyException

java - Maven 站点 scannotation.jar

java - spring中如何将整个表添加到缓存中

java-8 - 如何在 Project Reactor 中缓存项目并避免 Cache Stampede?

java - 咖啡因:如何得出合适的缓存大小

java - sdkman 缺少特定的 Java 版本

java - IntelliJ 调试问题

java - 应用程序 (src/main) 正在运行时,类路径上的 src/test/resources 中的文件是否存在?

java - 含咖啡因的 LRU

java - 如何在 Spring Java 配置中创建 Jcache?