gpt4 book ai didi

java - Spring boot - 使用动态 TTL 周期驱逐缓存

转载 作者:行者123 更新时间:2023-12-04 13:32:48 28 4
gpt4 key购买 nike

从我的微服务(SERVICE-A)中,我调用了另一个微服务(SERVICE-B)的 rest api 调用以登录并获取访问 token ,该 API 将使用该 token 的 TTL 进行响应。
我需要缓存 token ,直到 SERVICE-B 响应的 TTL(秒)。所以我的实现如下,

@Cacheable("USERTOKEN")
public String getUserToken()
{
//Hits Service-B
//Gets token and TTL as a response from Service-B
//Returns Token or Token with TTL
}
我需要将上述方法更改为
@Cacheable("USERTOKEN")
public String getUserToken()
{
//Hits Service-B
//Gets token and TTL as a response from Service-B
//Sets expiry time for "USERTOKEN" cache <-- this needs to be added
//Returns Token or Token with TTL
}
即使在从 getUserToken() 返回之后,如果可以使用 getUserToken() 返回的 TTL 为“USERTOKEN”缓存设置过期时间,它也会很好。我们可以为驱逐设置预定,但这将是一个静态时间段。但在这里我需要根据来自 Service-B 的响应将其设置为动态值。我怎样才能做到这一点。

最佳答案

如果您使用 caffeine cache ,您可以使用不同的过期策略:
来自 caffeine wiki page :

// Evict based on a varying expiration policy
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));

关于java - Spring boot - 使用动态 TTL 周期驱逐缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64059670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com