2017-04-12 98 views
0

我想要一个缓存刷新策略,如果缓存值在5分钟后变为陈旧,我需要在第4分钟触发刷新值,以便新值在第5分钟可用,并且任何请求在第5分钟尝试获取数据时,既不必等待负载也不会获取过时的数据。强制非阻塞刷新刷新

如果我一起使用refreshAfterWrite(4,Minute)和expireAfterWrite(5,Minute),使用Guava我可以解决这个问题,这些问题是经常查询的键。但是,我有几个很少被查询的键,对他们来说,请求可能需要等待加载。

有没有解决这个问题的方法?

+0

缓存拥有短暂的,recomputable数据往往比完整数据集小得多。因此删除不经常使用的条目是理想的。如果你想要完整的数据集,你可能会有一个预定的线程重新加载并交换一张地图。 –

回答

0

您所描述的内容作为Ehcache 2.x中名为scheduled refresh ahead的功能存在,该功能使用石英调度程序。

此功能允许您定期刷新缓存中的一部分密钥集(的一部分)。请注意,在刷新整个密钥集的情况下,根据密钥集大小和刷新所有条目所需的时间,它可能会成为系统上的一个负担。

0

documentation explains缓存不会在后台为您做任何工作(而且这实际上是一项功能)。因此,如果缓存的吞吐量不足以确保所有期望的密钥总是最新的,则应创建一个任务(例如,使用ScheduledExecutorService),该任务偶尔会刷新您的所有密钥。

这可能是这样的:

scheduler.scheduleAtFixedRate(
    () -> cache.asMap().keys().stream().forEach(cache::refresh), 4, 4, TimeUnit.MINUTES);