2

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

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

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

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

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

4

1 回答 1

5

这可以通过使用自定义过期策略并利用无法到达的持续时间来完成。最长持续时间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));
于 2020-05-11T02:48:14.730 回答