gpt4 book ai didi

java - 如何实现值为命中数的 Guava Cache?

转载 作者:行者123 更新时间:2023-12-01 14:21:21 31 4
gpt4 key购买 nike

我正在尝试实现一个缓存,该缓存将计算过去 5 分钟内的登录尝试次数,在我的代码中我想检查用户尝试的次数是否超过 MAX_ATTEMPTS。

在我在网上找到的所有“Guava Cache”代码示例中,都使用加载方法从其他来源获取值或使用某种方法计算它,我如何在每次缓存命中时递增它?

static LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
.maximumSize(100000)
.expireAfterAccess(5, TimeUnit.MINUTES)
.build(
new CacheLoader<String, Integer>() {
public Integerload(String user) {
return ????;
}
}
);

稍后在运行时我想检查:

if(cache.getIfPresent(user) != null && cache.get(user) > MAX_ATTEMPTS)

并且在以下情况下增加它:

if(cache.getIfPresent(user) != null && cache.get(user) <= MAX_ATTEMPTS)

最佳答案

@Oren 您的解决方案不是线程安全的,因为您正在对缓存外部的值进行操作。你最好用 Cache#asMap() 查看和更改内部值 ConcurrentMap#compute(K, BiFunction<K, V, V>) 方法:

forgetPasswordCache.asMap().compute(email, (cachedEmail, currentCount) -> {
if (currentCount != null && currentCount >= RESET_PASSWORD_MAX_ATTEMPTS) {
logger.error("User with id: " + user.getId() + " and email: " + email +
" has reached the maximum number of reset password attempts, the mail will not be sent");
return null;
}

if (currentCount == null) {
return 1;
} else {
return currentCount + 1;
}
});

关于java - 如何实现值为命中数的 Guava Cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52703795/

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