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

java - 使用 expireAfterAccess 执行哪种方法使 Guava 缓存过期?

我正在使用 Guava 缓存管理器和设置expireAfterAccess值。我想知道调用哪个方法来使缓存中的条目过期?

0 投票
0 回答
1584 浏览

java - Google Guava CacheBuilder - 来自 MongoDB 集合的批量加载问题

我正在尝试覆盖 Google Guava 的 CacheLoader loadAll() 方法。我想做一个批量查找​​并检索 Employee 集合中的所有文档,这些文档没有像CachesExplained中所说的那样特别请求:

请注意,您可以编写一个 CacheLoader.loadAll 实现来加载未特别请求的键的值。例如,如果计算某个组中的任何键的值会为您提供组中所有键的值,则 loadAll 可能会同时加载该组的其余部分。

我搜索了互联网,发现唯一与我的问题远程相关的帖子是Google Guava 的 CacheLoader loadAll() method Implementation Issues。但是,我仍然无法从我的集合中批量检索所有文档。每当我运行我的代码时,从数据库中检索到的唯一值是通过列表专门传入的值。

假设我有一个 Mongo 集合名称员工,其中包含 3 个员工文档:

员工等级:

每当我运行此方法时:

它只打印出来:

而不是上面引用的CachesExplained中描述的所有三个名称。

我是否误解了上面的引用,并且 CacheLoader 只检索传递给 loadAll() 方法的值,而不是从集合中检索所有值?任何帮助都感激不尽

0 投票
1 回答
366 浏览

java - 空番石榴缓存大小?

只是想知道系统是否为空的番石榴缓存预先分配了任何空间?我是番石榴缓存的新手,有人可以帮我理解这个问题吗?

我也用下面的代码测试它:

奇怪的是......不知道为什么之后使用的内存减少了。有人可以解释一下吗。

非常感谢 : )

0 投票
0 回答
888 浏览

java - 如何使用 Google Guava LoadingCache 实现具有时间驱逐和回退的缓存

阅读https://github.com/google/guava/wiki/CachesExplained后,Google Guava 的缓存很棒

我要实现的需要满足以下要求:

  1. 特定键的缓存应在 10 分钟后过期,以便下一次调用 get(key) 将始终调用createExpensiveGraph(key)更新和重置计时器(expireAfterWrite我相信已经这样做了)。
  2. 如果下一次调用createExpensiveGraph(key)由于某些意外错误而失败,我仍然想使用旧值,即使下一次调用发生在 10 分钟后。

我认为对于 1,这是 Guava 的本质LoadingCache,但是对于 2,我们如何在保持 1 的同时实现它?

0 投票
1 回答
360 浏览

java - 如何处理 Guava Cache 中的脏数据

Guava Cache用来缓存我的数据。缓存中的数据如果数分钟未使用将被清除。

如果我修改我的数据,我会更新缓存中的数据,并将数据标记为“脏”(因为它是被修改的,并且与数据库中的数据不同)。每5分钟我会将“脏”数据推送到数据库(即更新数据库中的数据)。

问题是,有一个“脏”数据A。在将数据A推送到数据库之前,数据A已经被清理了,那么我将丢失“脏”数据A。

所以,我在数据被清理后添加了一个,它RemovalListener会注意到我,我会添加一个回调函数。在函数中,我尝试将数据放回缓存。但在多线程环境中,它不能保证数据正确。Guava CacheRemovalListener

例如:

1)缓存:清理数据A

2)线程1:获取数据A,缓存中的数据A已被清理,因此缓存将从数据库中获取数据A。并且数据库中的数据A不是最新的。所以线程 1 得到一个不正确的数据 A。

3)缓存:运行RemovalListener回调。

那么,如何处理脏数据,以便在多线程中保证数据始终正确?谢谢!

0 投票
1 回答
6834 浏览

java - java - invalidateAll() 和 cleanUp() 之间的谷歌番石榴缓存区别

假设我有一个Cache这样定义的:

从我读到的(如果我错了,请纠正我):

如果在 0:00 写入值Cache,则应在 60 秒后将其移至“准备好被驱逐”状态。实际从 中删除值Cache将在下一次缓存修改时发生(缓存修改到底是什么?)。那正确吗?

另外,我不确定方法invalidateAll()cleanUp()方法之间有什么区别,有人可以提供解释吗?

0 投票
1 回答
984 浏览

java - 如何可靠地从 Guava LoadingCache 中删除记录?

我正在使用 Guava将一些数据填充到其中,并且我想每 1 分钟LoadingCache从中删除所有条目。LoadingCache

increment以多线程方式从代码中的许多不同位置调用方法。因此,在 1 分钟内,它将在clientIdMetricCounterCache. 现在我想每 1 分钟后可靠地删除所有这些指标,并将所有这些指标发送到数据库。

就我而言,有时写入increment方法可能非常慢,但我仍然想每 1 分钟删除一次所有这些条目,而且我根本没有在这个缓存上进行任何读取,只是写入它,然后通过发送到一些删除这些记录其他系统。以下是我在 Guava wiki中看到的内容

使用 CacheBuilder 构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行或任何类似操作。相反,它在写入操作期间执行少量维护,或者如果写入很少,则在偶尔的读取操作期间执行。

那么它是如何expireAfterWrite工作的呢?它是否像调度程序一样工作,每 1 分钟运行一次并删除其中的所有条目clientIdMetricCounterCache,然后它会在 1 分钟后再次唤醒并从同一缓存中删除所有条目并继续这样?阅读 wiki 后,我怀​​疑它是否可以这样工作。如果没有,那么我如何可靠地每 1 分钟删除这些记录并发送到其他系统,因为我的写入可能在一段时间内很少见?

看起来我可能必须使用Guava TimeLimiter接口,SimpleTimeLimiter或者可能要ScheduledExecutorService可靠地使呼叫超时,然后删除条目?如果是,任何人都可以提供一个示例,这将如何在我当前的示例中起作用?

0 投票
1 回答
4625 浏览

java - 使用 Google Guava 获取列表

我是 Guava 的新手,我想返回逗号分隔的用户列表,本质上是一个String。我正在使用一个第三方 API 来获取列表。如果用户查询,我想缓存该列表并返回整个列表。

我在网上看了几个例子,他们使用LoadingCache<k, v> and CacheLoader<k,v>. 我没有任何第二个参数,并且用户名是唯一的。我们的应用程序不支持对用户的个人查询

有什么味道/我可以 twikLoadingCache可以让我这样做吗?就像是

0 投票
1 回答
135 浏览

java - Guava CacheBuilder 提前驱逐项目

我正在尝试创建一个简单的缓存,我可以在其中将一些数据元素存储在地图中。我需要将这些数据保留大约 16 个小时左右,之后我可以让旧项目过期。我正在实例化我的 LoadingCache :

有一个过程每分钟向列表中添加约 16 个项目。每隔 12 分钟左右,缓存就会被完全清除。我对导致缓存被清除的原因感到困惑,远远早于 expireAfterWrite() 中设置的时间。

0 投票
2 回答
4362 浏览

maven - IntelliJ IDEA 中的 Maven Guava 依赖“无法解析符号‘google’”

IntelliJ 说无法解析符号“谷歌”。关于此导入:

即使我已经正确添加了依赖项并且它没有抱怨它:

我已经更新了我的 Maven 存储库。我在 IntelliJ IDEA 中启用了 Maven 自动导入。我的项目使用的是 SDK 1.8 版。基于网络上的大量示例,这应该有效,但事实并非如此。

我发现是一个类似的问题(尽管不是同一个问题,因为我的代码无法编译)。我尝试使缓存无效并重新启动,但没有帮助。最佳答案还建议删除IDEA系统目录。我不知道这是否是个好主意,如果我这样做会破坏多少东西。