问题标签 [google-guava-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 回答
5546 浏览

java - 如何模拟 Google Guava 缓存生成器?

我需要为这个类编写单元测试,以便我尝试如下模拟 Google Guava 缓存。

我得到了一些 NullPointer 异常。

注意:我知道,我可以通过一些可测试的方式更改方法。在这种情况下,我不能这样做。

有什么办法可以模拟这本书的缓存吗?

0 投票
1 回答
1707 浏览

java - Guava Cache expireAfterWrite 仅适用于 getIfPresent 使用?

这个问题是为了验证观察到的行为,以确保以正确的方式使用 Guava Cache。

我已经设置了两个 Guava 缓存(参见下面的代码):有和没有构建器 - 正如 Guava文档所述:

使用 CacheBuilder 构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行,或任何类似的操作。

似乎只有在getIfPresent()使用方法时才会观察到过期,即当查询键时,null在一段时间后返回值 > 过期间隔在键/值被写入缓存时传递。如果使用 CacheLoader 构建的 Cache 使用get()getUnchecked()导致CacheLoader.load()方法被执行,则不会观察到过期,即null永远不会返回值。

这是正确的期望吗?

感谢您的耐心和帮助。

0 投票
1 回答
2777 浏览

caching - 键列表的 LoadingCache

我有一个下游服务,它获取 id 列表并返回 id 的数据。我正在探索 Guava LoadingCache 来缓存这些值。但是 LoadingCache 中的加载器只接受一个键。有什么方法可以使用键列表。

0 投票
1 回答
805 浏览

java - 如何在将 Guava 缓存发送到另一个方法时每 30 秒清空一次?

我正在通过调用add方法从多个线程填充我的番石榴缓存。现在从每 30 秒运行一次的后台线程,我想将缓存中的任何内容发送到sendToDB原子方法?

下面是我的代码:

这是将cache地图发送到我的方法的正确sendToDB方法吗?基本上我想发送 30 秒内缓存中的所有条目并清空缓存。之后,我的缓存将在接下来的 30 秒内再次填充,然后执行相同的过程?

我认为 usingcache.asMap()可能不是正确的方法,因为它不会清空缓存,所以它也会反映我的sendToDB方法中缓存上发生的所有更改?

0 投票
1 回答
594 浏览

java - 在 Guava Cache 中查找一个区间内的记录

我正在使用 Spring SpEL 评估一些结果,我想缓存这些结果,因此我不必评估具有相同参数的表达式。

我缓存的密钥对象:

我找到interval包含给定记录的解决方案dateTime

我想利用cache.get(key, valueLoader)方法,以便它可以在需要时将值本身放入缓存中,但我想不出一种方法来利用isBetweenInclusive这种方法。

我尝试在遇到问题时发表评论:

我将此方法称为:

当然,由于我不知道如何使用上面提到的方法,所以我必须自己使用cache.put(new CachedResult(...))将记录放入缓存中。

asMap有没有比像地图一样调用和过滤缓存更好的方法来过滤缓存?我可以以某种方式使用cache.get(key, valueLoader)Guavas 甚至 GuavasCacheLoader以便它可以自动输入值吗?

随着性能的发展,我一次最多可以有 5-10 条记录,但是我会从中读取很多,所以读取时间对我来说非常重要,我不确定我当前的实现是否会迭代5-10 条记录,并检查每条记录是最好的方法。

0 投票
1 回答
1862 浏览

java - Guava cache expireAfterAccess issue

I have a question. If I use expireAfterAccess and suppose my entry gets expired after 2 hours. Now if I call get() for that entry after some time (say 5 hours), will it get cached again? or will it expire for good?

0 投票
1 回答
210 浏览

java - Conditional expireAfterAccess in Google cache

I'm setting up my cache like that:

and

I want the instances with canExpire = true be expired regurarly, but those with false not.

Is there any standard / straight-forward way to achieve such behaviour?

0 投票
1 回答
6851 浏览

java - Guava CacheLoader 抛出并捕获自定义异常

我正在尝试使用 Google Guava Cache 按服务相关对象进行缓存。在缓存未命中时,我使用我的 REST 客户端来获取对象。我知道我可以通过以下方式做到这一点:

现在,client.getKey(Key k)实际上抛出InternalServerExceptionand ResourceNotFoundException。当我尝试使用此缓存实例获取对象时,我可以将异常捕获为ExecutionException.

但是,我想专门捕获和处理我定义的 CacheLoader 抛出的异常(即InternalServerExceptionResourceNotFoundException)。

我不确定检查实例是否ExecutionException是我自己的异常之一是否会起作用,导致 load() 方法的签名实际上 throwsException而不是ExecutionException。即使我可以使用instanceof,它似乎也不是很干净。有什么好的方法来解决这个问题吗?

0 投票
1 回答
5554 浏览

java - 如何理解番石榴缓存统计指标?

我在我的一个库中使用 Guava 缓存,并且我公司的其他一些服务(由其他团队管理)正在使用该库。从我的图书馆我cache stats每次都在记录50000。以下是我在记录时看到的输出

而我的缓存配置如下图:

谁能帮助我了解我们的命中率以及如何解释上述缓存指标?我很困惑这些数字告诉我什么。基于上述结果,如果我们向上maximumSizeexpireAfterWrite间隔,我们可以看到更好的性能吗?

注意:我们仍在使用 guava-11.0.2,由于某种原因我无法升级。

0 投票
1 回答
606 浏览

guava - 番石榴缓存的removingListener 是否在单独的线程中运行?

当对象从番石榴缓存中删除时,我想执行一些清理。但我需要在一段时间后这样做。我可以在那里睡觉吗?它会阻塞所有线程吗?还是removingListener 在单独的线程中运行?