急切地重新填充 EhCache 而不是等待读取

Eagerly repopulate EhCache instead of waiting for a read

在我的场景中,获取新鲜(非缓存)值是一项非常昂贵的操作,因此必须始终存在预先计算的缓存值,而不是像 EhCache 那样在读取时刷新它们。

为此,在 TTL 过期时触发一个线程用新值重新填充缓存听起来很合理,因此永远不会等待读取。

有没有办法使用 Ehcache 实现这一点?监听 OnElementExpired/Evicted 事件以重新填充缓存似乎是行不通的(当我收到事件时,读取已经在等待)。

我想我可以使缓存本身成为永恒的,并有我自己的重新填充的计划任务,但是我从 EhCache 中得到的东西比我现在拥有的哑地图什么都没有。真的是这样吗?有没有办法让EhCache帮我解决这种情况?

看看 RefreshAheadCache,由 EHCache 提供。

但是,我找不到任何它的使用示例和成熟的指标。

class 的评论说:

A cache decorator which implements read ahead refreshing. Read ahead occurs when a cache entry is accessed prior to its expiration, and triggers a reload of the value in the background.

这并不能直接解决您下面提到的问题:

My problem is how to repopulate the cache without waiting for a read to trigger it

据我所知,没有标准的方法可以做到这一点。原因是到期不是基于计时器的。

(无耻)提示:因为我觉得这个很有用,所以我在cache2k中实现了这个。该功能称为后台刷新,由 CacheBuilder.backgroundRefresh(true).

启用

也许这段代码可以提供帮助:

https://github.com/jsr107/jsr107spec/issues/328

Ehcache 提供了一种通过计划刷新来执行所需操作的方法。

为了使它与 Ehcache 一起工作,您需要做两件事:

  • 使用 cache loader - 即移动到缓存通读模式。这是必需的,否则 Ehcache 不知道如何获取映射到键的数据。
  • 配置 scheduled refresh - 这通过启动 quartz 调度程序实例来工作。