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

java - .refreshAfterWrite() 结束时 loadingCache 调用哪个函数?

我正在尝试使用 Google LoadingCache 创建缓存。

我的程序使用另一个休息服务。我想知道是否可以配置缓存,以便在 .refreshAfterWrite 结束后调用 loadAll 函数。

本质上,一旦 refreshAfterWrite 计时器结束,我想做一些类似于此链接中数字 8 的操作。 http://www.baeldung.com/guava-cache

谢谢

0 投票
0 回答
248 浏览

java - 如何使用 Guava LoadingCache 检测事件频率

我需要检测事件频率,例如在 X 秒内发生了 N 个相同的事件。

我的检测过程 24/7 连续执行。

我最初的设计采用了 a ConcurrentHashMap,key 是一个自定义值对象,代表事件标识,值是Joda DateTime事件发生的时间。

这种方法可以很好地检测事件频率,但是我还必须实施一个驱逐过程来删除“陈旧”事件。

谷歌搜索我发现的一种改进方法com.google.common.cache.Cache,它看起来很有希望,因为它的相关CacheBuilder.expireAfter#####(),但是所有 Cache 的 get 方法都被弃用了。显然我必须使用LoadingCache.

方法的所有示例都LoadingCache load()显示了通过访问数据库或其他“昂贵”操作来检索要加载的值。这些都不适合我的用例。我有填充缓存所需的键和值,当我的值不驻留在后端数据存储中时,如何在缓存未命中时“加载”我的事件?

我应该使用cache.put(Key, Value)吗?

0 投票
1 回答
339 浏览

java - 如何使用 Guava 中的 CacheBuiler 作为 ConcurrentLRUCache

所以我使用 Guava 的 CacheBuilder 作为 ConcurrentLRUCache 意味着这个缓存是线程安全的并且具有 LRU 属性,请参阅CacheBuilder Guava Docs

我的假设是当多个线程同时启动时具有相同的键,一个 CyclicBarrier 用于此,然后一个线程将 put() 放入缓存,而其他线程等待。之后,其余线程将看到一个值已经在缓存中,而不是 put() 到缓存中。

这不适用于下面的代码,因为每个线程都会创建一个新的 Object() 并将其放入缓存中。通过运行测试并查看控制台以查看每次都创建了不同的对象来进行验证。

  • 我使用
    CacheBuilder 的方式有什么本质上的问题吗?
  • 我可以使用更好的方法吗?
  • 有我可以使用的图书馆吗?

请和谢谢!

0 投票
1 回答
893 浏览

guava - 定时缓存过期如何工作?

我知道 Guava Cache 允许为单个缓存配置到期时间。Guava 是否使用在配置的秒数后唤醒缓存以使缓存无效的计时器来执行此操作?

我有一个长期运行的事务。无论事务开始时缓存中的内容是什么,我都希望它一直持续到事务结束。因此,即使缓存的有效秒数在事务期间过期,从缓存访问的值应该保持不变,直到我们到达事务结束。这在番石榴中可行吗?

谢谢,
亚什

0 投票
1 回答
1013 浏览

java - 考虑到旧密钥的番石榴缓存

我面临番石榴缓存的问题。当我在缓存中只有一个元素时,一切都很好。但是当我加载第二个元素时,它试图用较早进入的键来选择

日志说:

例如,当我调用 method("1", 2) 时,它会将值加载到缓存中,然后我可以从缓存中获取它。现在我调用方法(“3”,4),这不在缓存中,所以调用getValue()并且日志打印出方法(“1”,2)的键

我哪里错了?

0 投票
1 回答
3517 浏览

java - LoadingCache expireAfterWrite 未按预期工作

我有一个像这样的加载缓存:

但是当我做这样的事情来测试时:

我仍然得到 2 而不是零。为什么 ?超过 120 秒后,如果没有错,我应该得到零尺寸?

MyCacheLoader

MyRemovalListener

0 投票
3 回答
24772 浏览

java - 对调用静态方法的类进行单元测试

我正在尝试对调用类“B”的静态方法的类“A”进行单元测试。类'B'本质上有一个谷歌番石榴缓存,它从给定键的缓存中检索值(对象),或使用服务适配器将对象加载到缓存中(以防缓存未命中)。服务适配器类又具有其他自动装配的依赖项来检索对象。

这些是用于说明目的的类:

A级

B类

服务适配器类

我能够成功地进行集成测试并从(或加载到)缓存中获取(或加载)值。但是,我无法为 A 类编写单元测试。这是我尝试过的:

A类的单元测试

当我运行单元测试时,它在进行调用的 ServiceAdapter 类中出现 NullPointerException 失败: mainService.getTheObject(key) 。

如何在单元测试类 A 时模拟 ServiceAdapter 的依赖关系。我不应该只关心 A 类的直接依赖关系,即。B.

我确信我做的事情根本上是错误的。我应该如何为 A 类编写单元测试?

0 投票
1 回答
338 浏览

java - 使用 Guava 缓存的概率提前过期

我有一个使用创建的番石榴缓存expireAfterWrite(20, TimeUnit.MINUTES)。缓存在创建时也会使用数十个条目进行初始化。当值过期时,客户端应该调用外部服务并刷新缓存。

问题是 - 所有的初始化值都会在 20 分钟后同时过期,并且客户端几乎会在同一个实例中调用服务数十次。

我不希望这种情况发生。为了避免这种情况 - 一个想法是在概率上使条目比 TTL 早一点过期,这样服务就不会同时受到很多打击。

不幸的是,我没有看到使用 Guava 缓存执行此操作的选项 - 至少没有从 Wiki 或 Javadoc 中弹出。有没有其他可用的图书馆?我试图避免为此目的编写自己的缓存实现。

0 投票
1 回答
808 浏览

java - com.google.common.collect.MapMaker 到期

我刚刚下载了最新版本的番石榴

我看到 MapMaker 类不再有expiration我发现它有用的方法,我还没有找到任何替代方法。

0 投票
1 回答
61 浏览

java - java 缓存 - 在使用 Map 和使用 Graph 之间进行选择

在我的 java Spring 应用程序中,我需要构建一些配置元数据的进程内/内存缓存,其结构如下:

问题:

哪种技术更适合此目的:Map、来自 Google Guava 的 ValueGraph、EhCache 或其他?