咖啡因缓存 - 指定条目的到期时间

tsa*_*512 9 java caffeine

我正在尝试进一步了解咖啡因缓存。我想知道是否有一种方法可以为缓存中填充的条目指定超时,但其余记录没有基于时间的到期时间。

本质上我希望有以下界面:

put(key, value, timeToExpiry)// 输入具有指定 timeToExpiry 的键和值

put(key, value)// 输入没有 timeToExpiry 的键值

我可以编写接口和管道,但我想了解如何配置咖啡因以满足上述两个要求。我也愿意拥有两个单独的咖啡因缓存实例。

Ben*_*nes 9

这可以通过使用自定义过期策略并利用无法到达的持续时间来完成。最大持续时间为Long.MAX_VALUE,即 292 年(以纳秒为单位)。假设您的记录在(如果)过期时保留,那么您可以将缓存配置为,

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
    .expireAfter(new Expiry<Key, Graph>() {
      public long expireAfterCreate(Key key, Graph graph, long currentTime) {
        if (graph.getExpiresOn() == null) {
          return Long.MAX_VALUE;
        }
        long seconds = graph.getExpiresOn()
            .minus(System.currentTimeMillis(), MILLIS)
            .toEpochSecond();
        return TimeUnit.SECONDS.toNanos(seconds);
      }
      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));
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的及时回复,这有助于创建具有 292 年超时的初始图表,但是是否也可以按照 `put(key,value, timeToExpiry)` 的方式执行某些操作,在其中指定到期时间您正在将值放入缓存中吗? (2认同)
  • @MartinVanNostrand 这个例子是如果您可以从该值派生自定义到期时间。例如,Google 允许您将地址&lt;-&gt;地理编码分辨率缓存 30 天。您可以将其存储在数据库记录中,内存中的缓存将知道到期以兑现这一点。与 http 响应 etag 类似。这是你要弄清楚的,否则如果是静态配置,你可以给出常量值。 (2认同)