当前位置: 首页 > 知识库问答 >
问题:

咖啡因缓存:如何在不更改过期时间的情况下更新缓存值

刘玉石
2023-03-14

我正在使用咖啡因缓存,并寻找一种方法来更新缓存中的值,而不更改其过期时间。

场景是我使用缓存来加速数据加载。数据更改延迟5秒是可以接受的,而我希望返回速度很快。此外,我希望这些缓存在第一次命中1天后过期,以避免不必要的内存使用。

因此,我希望每个缓存的密钥持续一天,但其值每5秒更新一次。

refreshAfterWrite方法似乎已关闭,但刷新持续时间后的第一个返回值仍然是旧值。这对我来说并不理想,因为两次点击之间的持续时间可能是几个小时。在这种情况下,我仍然希望得到一个相对较新的结果(不超过5秒)。

所以我试图手动更新每个密钥。

首先,我用这种方式构建了一个有24小时过期时间的缓存:

cache = Caffeine.newBuilder()
    .expireAfterWrite(24, TimeUnit.HOURS)
    .build();

然后,我每5秒编写一个计划任务,迭代缓存中的键并执行以下操作:

cache.asMap().computeIfPresent(key, mapperFunction);

然后我检查了钥匙的年龄:

cache.policy().expireAfterWrite().get().ageOf(key)

然而,这个年龄并没有像预期的那样增长。我认为computeIfPresent方法被认为是一种“写入”,因此过期时间也会被更新。

有没有一种方法可以在不改变咖啡因过期时间的情况下进行值更新?或者我的场景有其他方法吗?

共有1个答案

司空高义
2023-03-14

写入是映射的创建或更新,因此expireAfterWrite不适合您。相反,您可以设置自定义过期策略,该策略设置初始持续时间,并且在读取或更新时不执行任何操作。这是使用expireAfter(expire)完成的,例如

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
    .expireAfter(new Expiry<Key, Graph>() {
      public long expireAfterCreate(Key key, Graph graph, long currentTime) {
        return TimeUnit.HOURS.toNanos(24);
      }
      public long expireAfterUpdate(Key key, Graph graph, 
          long currentTime, long currentDuration) {
        return currentDuration;
      }
      public long expireAfterRead(Key key, Graph graph,
          long currentTime, long currentDuration) {
        return currentDuration;
      }
    })
    .build(key -> createExpensiveGraph(key));
 类似资料:
  • 我已经使用咖啡因缓存设置了一个场景,但我无法让它工作,当参数相同时,总是调用真正的方法。这是我的配置: 波姆。xml CacheManager的配置类 然后是具有可缓存方法的类: 我还尝试将缓存名称添加到可缓存批注: 并将移动到Spring Boot主应用程序类。 真正的方法总是被调用的。 你知道我做错了什么吗? 谢谢

  • 我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。 所以我看到没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它 我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一

  • 我试图使用Spring Boot与咖啡因和一些注释函数。在我们的测试中,对控制器endpoint的异步调用出现了一些问题,这些问题似乎与我们使用非异步缓存的事实有关。 在做一些研究时,我看到了很多使用Caffeine手动使用的例子,但是在和Spring Boot和注释中找不到任何东西。看起来和具有非常不同的API。是否可以异步使用默认的Spring Boot? 谢谢

  • 一、简介 当对PHPSSO进行修改后,执行此操作。 二、功能演示 更新应用列表缓存。如下图所示:

  • 我正在使用django模型。django设置中的TIMEZONE是UTC。并通过做一些算术来构建时间戳。 当我使用::timestamp时,时间戳返回为2021 07月26日00:00:00如果我使用::timestamp,它将变为2021 07月26日00:00:00,即使请求的\u时区是“美国/纽约” 我希望输出为2021 07月26日00:00:00-04:00,即显示与“附加美国/纽约”偏