问题标签 [caffeine-cache]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
824 浏览

caching - 咖啡因缓存:如何在不更改过期时间的情况下更新缓存值

我正在使用咖啡因缓存并寻找一种方法来更新缓存中的值而不更改其过期时间。

场景是我使用缓存来加速数据加载。5 秒的数据更改延迟是可以接受的,但我预计返回速度会很快。此外,我希望这些缓存在第一次命中后 1 天到期,以避免不必要的内存使用。

因此,我希望每个缓存的键都持续一天,但它的值每 5 秒更新一次。

refreshAfterWrite方法似乎很接近,但刷新持续时间后它的第一个返回值仍然是旧的。这对我来说并不理想,因为两次点击之间的持续时间可能是几个小时。在这种情况下,我仍然想要一个相对较新的结果(不超过 5 秒)。

所以我试图手动更新每个键。

首先,我以这种方式构建了一个具有 24 小时过期时间的缓存:

然后我每 5 秒编写一个计划任务,迭代缓存中的键并执行以下操作:

然后我检查了钥匙的年龄:

然而,年龄并没有像预期的那样增长。我认为该computeIfPresent 方法被视为“写入”,因此到期时间也会更新。

有没有办法在不改变咖啡因过期时间的情况下进行价值更新?或者我的场景的任何其他方法?

0 投票
1 回答
726 浏览

java - Mock Test Cache

I'm trying to test my cache layer with mockito.

I'm using Caffeine as described here

Basically, I have this...

That works perfectly, the method is cached and works fine.

I want to add a test to verify the DB call is invoked only once, I have something like this but it's not working:

I've tried several combinations of @Profile/@ActiveProfile, Config/ContextConfiguration etc.

0 投票
1 回答
1053 浏览

java - Caffeine LoadingCache - 具有自定义过期策略的驱逐

使用Caffeine 2.8.1和 Java 8。我创建了LoadingCache<String, Boolean>. 我正在加载缓存,cache.putAll(getAllKeyValues())其中getAllKeyValues()返回一个Map<String, Boolean>.

我已经指定了一个CacheLoader来通过调用keyExistsOnServer(key)调用外部服务来获取值的方法来计算值。

我已经指定了一个自定义过期策略,如果该值设置为false在缓存中创建/更新条目时,我想在 10 分钟内从缓存中逐出该条目。并保持它只要Long.MAX_VALUE值是true


问题#1:根据我想要实现的目标,我的到期政策看起来是否正确?

问题2:

我没有看到RemovalListener根据驱逐政策被召唤。这可能是由于此github 问题中所述的清理任务的累积。

但是,我的代码的正确性取决于这样一个事实,即一旦false一个条目的过期持续时间(如果是值,则为 10 分钟)已经过去,如果我们调用,cache.get(key)那么它不应该从缓存中返回过期值,而是调用CacheLoaderkeyExistsOnServer( key)方法来获取值。有人可以断言这就是它的行为方式吗?

这是@Louis Wasserman 在 github 问题上所说的,但我不清楚这是否能澄清它:

实际上,发生的情况是 get 调用本身发现条目已过期并将其添加到要清理的条目队列中

问题#3:如果调用时RuntimeException抛出了CacheLoaderkeyExistsOnServer (key)方法会发生cache.get(key)什么?

问题#4cache.asMap()是否包含已过期但由于应计清理而未被驱逐的条目?

问题#5:当我currentDurationexpireAfterRead()方法中记录时,它似乎与经过的时间不一致。即,如果将其设置为6000000000000(10 分钟)并更新该值,false我预计 5 分钟后它应该是300000000000,但事实并非如此。为什么这样?

0 投票
1 回答
204 浏览

java - Perform action on expiry with Caffeine on Java

I want to create a cache like so

That i will populate with a temporary file like so,

Now after 1 minute I understand that cache.getIfPresent("jobid") will return null, my question is that is there some way in which I can trigger another task when this entry expires - deleting the temporary file itself.

Any alternative solution works as well.

0 投票
2 回答
747 浏览

java - 我可以像 CRON 作业一样安排 Java Spring Cache 在每个小时的顶部过期吗?

我目前将其设置为在 12 小时后过期。但是,它也会在每个缓存首次写入后 12 小时到期。我希望它只在上午 12 点和下午 12 点刷新。这可能吗?在我的 cacheConfig 文件中,我有:

我正在使用咖啡因缓存库。

0 投票
1 回答
900 浏览

java - `java.lang.ClassNotFoundException: com.github.benmanes.caffeine.cache.Caffeine`jackson-core 升级到 2.11.2 时的异常

我在我的 Spring 项目中使用com.fasterxml.jackson.core (v2.8.11)com.github.ben-manes.caffeine (v2.8.1)maven 依赖项。

当我将版本jackson-core从升级2.8.112.11.2

java.lang.ClassNotFoundException: com.github.benmanes.caffeine.cache.Caffeine

例外。有没有人遇到过类似的情况?任何建议都受到高度赞赏。提前致谢。

0 投票
3 回答
487 浏览

java - Java内存缓存

是否有可能在内存中实现缓存以避免完全堆消耗?

我的 spring-boot java 应用程序使用内存中的缓存,并将过期策略设置为 1 小时(Caffeine 库用于缓存目的)。在那之后,所有缓存实例都在老年代,需要收集完整的 GC。现在将 XMX 设置为 10GB,我可以看到经过几个小时的测试,我的缓存包含大约 100k 个实例,但是在堆中(正好在老一代中)我可以找到几百万个缓存对象的实例。有没有可能在内存中使用缓存并避免这种情况?

0 投票
1 回答
90 浏览

scala - Scalacache 从使用 memoizeF 设置的缓存中删除

我正在使用 CaffeineCachememoizeF来缓存将案例类作为输入的操作的结果,如下所示:

现在,在某些情况下,我需要从缓存中显式删除特定元素。

我想我可以使用myCache.doRemove(key),但从我在 ScalaCache 文档中看到的内容来看,当使用memoizeF密钥时,将“从类名、封闭方法的名称和所有方法参数的值”生成,而我没有从中进行反向工程key并与之一起使用doRemove是一个好主意。

是否有另一种方法可以从缓存中删除特定元素,如果它是使用 插入的memoizeF?或者,也许我可以以某种方式告诉memoizeF使用idfrom Foo 作为键,而不是从类名等生成它(我确定ids 对于每个 Foo 实例都是唯一的)?

对于这种情况,也许使用memoizeF根本不是一个好主意,我应该回到“手动”插入缓存?任何输入表示赞赏。我查看了官方文档并四处搜索,但没有运气。

0 投票
0 回答
475 浏览

caching - 咖啡因缓存:到期后立即重新加载

我正在维护一个键值缓存,它们都是字符串。每个条目都有自己的到期时间。所以我在下面有这个工作代码,只要请求任何过期的密钥,它就会重新加载数据。由于在我的案例中加载数据非常耗时并且来自外部服务,因此我发现每当到期时间过去时都需要立即在后台重新加载数据。因此,当一个获取值的请求在过期后出现时,缓存将已经有一个刷新的数据。

我正在使用 Java 8,所以在某处听说咖啡因调度程序可能无法正常工作。如果您有一个演示和任何示例,说明我如何在有或没有调度程序的情况下最好地实现这一点,那就太好了。使用不同缓存框架的建议 - 也欢迎。

我当前的代码会在一段时间后使条目过期,但仅在请求数据并将外部服务调用时间加到 get 方法时才会重新加载。

0 投票
1 回答
398 浏览

caching - 是否有咖啡因功能可以在定义的时间后从缓存中清除特定项目并同时重新创建它?

ExpireAfter 只会清除该项目,但不会重新创建该项目。所以我需要做的是,在预定义的时间间隔之后,我需要从缓存中清除特定项目,同时我需要重新创建它。如果数据没有变化,它可能会使用相同的数据重新创建。假设数据已更改,重新创建将提供最新的对象。

我的想法是一直从缓存中检索最新的项目。相比之下,刷新功能(https://github.com/ben-manes/caffeine/wiki/Refresh)将为第一个请求提供陈旧的项目并进行异步加载。因此,对于第二个请求,缓存将提供最新的对象。

  • 在我的情况下,重新获取过期条目的异步删除侦听器应该可以工作。您能否提供一些有关如何实现这一目标的信息?
  • 我也很想知道定时任务是怎么做到的?

假设缓存可以解决以下两种情况:

后续请求案例:

  • 我知道 refreshAfterWrite 将第一次提供过时的条目,但对于第二次请求,如果缓存尚未完成加载过期条目会发生什么?

  • 缓存是否阻塞第二个请求,完成重新获取,然后将最新值提供给第二个请求?

  • 这个想法是让缓存在定义的条目到期时间之后提供最新的数据。

在缓存必须一次性加载等于其容量的值的情况下:

  • 假设缓存大小为 100,加载所有 100 个项目的时间为 2 分钟。

  • 假设第一个请求将同时将 100 个项目加载到缓存中,在定义的到期时间之后,缓存应该驱逐并重新获取所有 100 个元素。

  • 对于从这 100 个项目中访问项目的第二个请求,我怎样才能使缓存足够智能,以便它返回已重新加载的条目并异步重新加载其他条目?

  • 这个想法不是阻止对现有条目的任何请求。为现有条目提供请求并为剩余的过期条目重新加载。