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

java - 迭代 Guava Cache 中的值会丢失数据

我开始对在 Guava 缓存中按值查找键的方法进行基准测试,我注意到与并发级别相关的奇怪行为。我不确定这是错误还是未定义的行为,甚至可能是预期但未指定。

我的基准测试应该在 Guava Cache 中按值查找键,我知道这不是通常的事情。

这是我完整的基准课程:

}

我注意到的是,当我更改.concurrencyLevel(1)为不同于 1 的数字时,我开始丢失数据。以下输出来自并发级别 4:

我注意到在使用HashMapHashTable使用相同的代码时我从未丢失任何数据,它的性能也更好:

Benchmark Mode Cnt Score Error Units ValueByKey.stringToIdByIteration avgt 16 58.637 ± 15.094 us/op ValueByKey.stringToIdByIterationConcurrentHashMap avgt 16 16.148 ± 2.046 us/op ValueByKey.stringToIdByIterationHashTable avgt 16 11.705 ± 1.095 us/op

我的代码是错误的还是 Guava 无法正确处理并发级别高于 1 的分区 HashTable?

  • 并发级别选项用于在内部对表进行分区,以便可以在没有争用的情况下进行更新。
  • 理想的设置是一次可能访问缓存的最大线程数。
0 投票
2 回答
984 浏览

java - 实现一个 Guava 缓存以永久存在

我有一个缓存,其中包含查找表中的多个值(约 50 条记录),我想将这些值放入缓存中,并且我不希望它过期。

我的实现如下所示:

在构造函数中,我检查缓存是否为空,然后从数据库中加载数据:

我能做些什么让它永恒?

0 投票
1 回答
633 浏览

scala - 从 scala 代码中使用 Google guava 时出现编译器错误

我正在使用 Scala 代码中的 Google Guava。当我尝试使用 Int 作为示例中的键类型时会出现问题:

看起来不错,但所创建对象的推断类型是LoadingCache[Int with AnyRef, String]

当我尝试获取本例中的元素时会发生错误:

Scala 编译器错误:

有人可以指出为什么会出现这样的错误以及我做错了什么吗?

环境:

  • 谷歌番石榴 15.0
  • 斯卡拉 2.11.5
0 投票
0 回答
465 浏览

java - LoadingCache 的缓存声明是如何做的

我可以连接LoadingCache一个@Cacheable方法。

我需要 GuavaCache 来支持 refreshAfterWrite

但我不明白如何将它LoadingCache与 Spring Cache 声明联系起来@Cacheable("cacheName")

0 投票
0 回答
1073 浏览

java - Guava 加载缓存,通过 db ulk 操作周期性填充缓存

因为我有一个批量操作来获取数据,所以我不想使用 refresh() 来更新单个项目,我想利用批量调用来定期更新缓存。

我想到了一些方法,因为我一直在调用 get() 来缓存,我想知道哪种方法是最佳的。

方法 1 定期调用 getAll(),它调用 loadAll()


方法二

只需使用Cache.asMap().putAll


我从https://github.com/google/guava/wiki/CachesExplained#inserted-directly读到过, 听起来 getAll 比 asMap.put() 好,所以我猜是首选方法 1?

0 投票
1 回答
466 浏览

scala - Scala Guava 类型不匹配问题

我正在尝试使用 Guava 缓存实现一个简单的用例,但面临一些问题,如下所示:

我得到的错误与我无法弄清楚的类型有关

有人可以就可能出现的问题提出建议。

0 投票
0 回答
1224 浏览

spring-boot - 跨多个实例驱逐内存缓存?

我们如何在不同的实例中驱逐内存中的缓存?

我们有一个横向扩展的架构,多个实例同时服务请求。它们中的每一个都附加了内存中的缓存。

我们需要立即驱逐所有实例。

为什么不用 Memcache/Redis 或其他提供商? 对 Redis/Memcache 的调用会产生网络延迟。除了速度之外,我们的数据大小要小得多,可以轻松放入一个实例中 [Max 100MB]

临时解决方案 作为临时解决方案,我们有基于时间的驱逐,时间相对较短 2.5 分钟。但是对于 2.5 分钟,它可以每个实例都可以提供自己的数据副本,这可能会导致不一致。我们如何一次在多个实例上缓存键?

0 投票
1 回答
3567 浏览

java - Guava 缓存在性能方面的表现如何?

我想使用 Guava 缓存机制来缓存请求-响应对的 web 服务调用,以提高网站的性能。但是,在继续解决方案之前,想知道 Guava 缓存在性能方面的表现如何?

谢谢,阿希什。

0 投票
1 回答
1855 浏览

java - 将第二个参数传递给 Guava Cache load() 方法

我之前在这里问过一个关于如何在 Java 中实现 Guava Cache 的问题,见这里。虽然它有效,但我最近注意到 getAllProfile 方法中的一个错误。

在该方法中,我传入了一个Profile名为profile. 这样一来,在服务层上,用户可以使用 @QueryParam 为工人的个人资料设置一个参数,以查看他们是否仍在工作:

此处创建的配置文件对象通过管理器层向下传递,并进入 DAO 层,其中设置的参数(如使用的布尔值)被解析为 select 语句的参数。

这里的问题是,由于我已经开始使用缓存,布尔值不再被解析。使用 System.out.println 调用该方法来评估所用字段的评估结果为 null。这是有道理的,因为我在缓存管理器中创建了一个新的 Profile 对象,除了缓存 get 方法没有在 getAllProfile 方法中获取配置文件之外,没有调用任何设置器;它只需要大小。

我想我可以通过在 load 方法中添加一个新的 Profile 参数来解决这个问题,如下所示:

但是, load() 似乎仅设计为采用一个参数,因此会出现此错误:

重申一下,我需要做的就是将在服务层中创建的配置文件对象传递给管理器层和缓存。这似乎就像将第二个参数传递给 load() 一样简单,但这似乎是不可能的。

编辑:

我已经编辑了 getAllProfiles 方法以使用 Callable:

这会产生一个错误,因为我正在传递Profile而不是List<Profile>. 不过,我需要传入profile,因此我可以通过 DAO 中的字段解析 SQL 语句。

0 投票
0 回答
171 浏览

java - 方法返回缓存结果而不是去数据库

我正在为我的 get 方法运行番石榴缓存。我注意到我的一种方法(根据姓名和部门从数据库中检索个人资料信息)仅从缓存中返回。如果一个条目不在缓存中,它应该去 DAO 从数据库中检索该配置文件。在我的例子中,它只是返回它放在缓存中的最后一个条目。

这是我的缓存代码和使用它的管理器层方法:

其工作方式是在服务层上,使用路径参数中的配置文件名称和部门调用 get 方法:

这些参数被传递给管理器,管理器应该从缓存或 DAO 加载。我知道 DAO 服务的代码在没有缓存的情况下可以正常工作;按预期替换来自 DAOreturn loadingCache.get(profile)的负载。return profileDAO.getProfileByFields(profile)此外,当我缩短缓存的到期时间(例如,缩短到 5 毫秒)时,它会在到期后从 DAO 加载。此外,getProfileByFields 中的 System.out 运行,显示参数已传递给配置文件对象。但是,loadingCache 中的 System out 没有运行,向我表明它永远不会到达。