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