弹簧缓存设置有效地过期时间-咖啡因

时间:2018-10-31 18:25:45

标签: spring-cache caffeine

我使用身份验证API来获取令牌并使用其他服务。该API返回令牌和到期时间。是否有可能获得返回的过期时间,并使用这些值设置expire_after_write?当前,此属性位于application.properties中,但是恐怕服务提供商有一天会更改expire_time,因为令牌已过期

,我们会遇到一些错误

2 个答案:

答案 0 :(得分:2)

您可以设置per-entry policy来评估条目并确定到期时间。由于令牌不会在缓存中被修改,因此您可以使用expireAfterCreate并让其他方法返回currentDuration来不对其进行修改。在文档中,

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
    .expireAfter(new Expiry<Key, Graph>() {
      public long expireAfterCreate(Key key, Graph graph, long currentTime) {
        // Use wall clock time, rather than nanotime, if from an external resource
        long seconds = graph.creationDate().plusHours(5)
            .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));

答案 1 :(得分:0)

通过设置自定义的 Expiry 实例,我们可以设置每个入口级别的到期时间。

示例

Cache<Integer, Employee> cache = Caffeine.newBuilder().expireAfter(new Expiry<Integer, Employee>() {
    @Override
    public long expireAfterCreate(Integer key, Employee emp, long currentTime) {
        return TimeUnit.SECONDS.toNanos(emp.getExpiryTime());
    }

    @Override
    public long expireAfterUpdate(Integer key, Employee emp, long currentTime, long currentDuration) {
        return currentDuration;
    }

    @Override
    public long expireAfterRead(Integer key, Employee emp, long currentTime, long currentDuration) {
        return currentDuration;
    }
}).build();

参考link