【问题标题】:Eagerly repopulate EhCache instead of waiting for a read急切地重新填充 EhCache 而不是等待读取
【发布时间】:2015-08-25 21:13:14
【问题描述】:

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

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

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

我想我可以让缓存本身永久化,并拥有自己的计划任务来重新填充,但是我从 EhCache 中得到的东西比我现在拥有的愚蠢地图一无所获。真的是这样吗?在这种情况下有没有办法让 EhCache 帮助我?

【问题讨论】:

  • 巨大的文字墙让我为 1000 美元 ;) 请重新格式化一下 :)

标签: java caching ehcache


【解决方案1】:

Ehcache 提供了一种通过计划刷新来做你想做的事情的方法。

您需要做两件事才能使用 Ehcache:

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

【讨论】:

  • 这看起来很有希望。非常感谢!我会阅读更多内容并接受您的回答。
【解决方案2】:

看看RefreshAheadCache,由 EHCache 提供。

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

班级评论说:

实现预读刷新的缓存装饰器。当缓存条目在其过期之前被访问时发生预读,并触发在后台重新加载该值。

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

我的问题是如何在不等待读取触发的情况下重新填充缓存

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

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

【讨论】:

    【解决方案3】:

    也许这段代码会有所帮助:

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

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2021-07-07
      • 2017-06-28
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多