我正在使用咖啡因缓存,并寻找一种方法来更新缓存中的值,而不更改其过期时间。
场景是我使用缓存来加速数据加载。数据更改延迟5秒是可以接受的,而我希望返回速度很快。此外,我希望这些缓存在第一次命中1天后过期,以避免不必要的内存使用。
因此,我希望每个缓存的密钥持续一天,但其值每5秒更新一次。
refreshAfterWrite
方法似乎已关闭,但刷新持续时间后的第一个返回值仍然是旧值。这对我来说并不理想,因为两次点击之间的持续时间可能是几个小时。在这种情况下,我仍然希望得到一个相对较新的结果(不超过5秒)。
所以我试图手动更新每个密钥。
首先,我用这种方式构建了一个有24小时过期时间的缓存:
cache = Caffeine.newBuilder()
.expireAfterWrite(24, TimeUnit.HOURS)
.build();
然后,我每5秒编写一个计划任务,迭代缓存中的键并执行以下操作:
cache.asMap().computeIfPresent(key, mapperFunction);
然后我检查了钥匙的年龄:
cache.policy().expireAfterWrite().get().ageOf(key)
然而,这个年龄并没有像预期的那样增长。我认为computeIfPresent
方法被认为是一种“写入”,因此过期时间也会被更新。
有没有一种方法可以在不改变咖啡因过期时间的情况下进行值更新?或者我的场景有其他方法吗?
写入是映射的创建或更新,因此expireAfterWrite
不适合您。相反,您可以设置自定义过期策略,该策略设置初始持续时间,并且在读取或更新时不执行任何操作。这是使用expireAfter(expire)
完成的,例如
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
.expireAfter(new Expiry<Key, Graph>() {
public long expireAfterCreate(Key key, Graph graph, long currentTime) {
return TimeUnit.HOURS.toNanos(24);
}
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));
我已经使用咖啡因缓存设置了一个场景,但我无法让它工作,当参数相同时,总是调用真正的方法。这是我的配置: 波姆。xml CacheManager的配置类 然后是具有可缓存方法的类: 我还尝试将缓存名称添加到可缓存批注: 并将移动到Spring Boot主应用程序类。 真正的方法总是被调用的。 你知道我做错了什么吗? 谢谢
我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。 所以我看到没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它 我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一
我试图使用Spring Boot与咖啡因和一些注释函数。在我们的测试中,对控制器endpoint的异步调用出现了一些问题,这些问题似乎与我们使用非异步缓存的事实有关。 在做一些研究时,我看到了很多使用Caffeine手动使用的例子,但是在和Spring Boot和注释中找不到任何东西。看起来和具有非常不同的API。是否可以异步使用默认的Spring Boot? 谢谢
一、简介 当对PHPSSO进行修改后,执行此操作。 二、功能演示 更新应用列表缓存。如下图所示:
我正在使用django模型。django设置中的TIMEZONE是UTC。并通过做一些算术来构建时间戳。 当我使用::timestamp时,时间戳返回为2021 07月26日00:00:00如果我使用::timestamp,它将变为2021 07月26日00:00:00,即使请求的\u时区是“美国/纽约” 我希望输出为2021 07月26日00:00:00-04:00,即显示与“附加美国/纽约”偏