强制非阻塞刷新缓存

时间:2017-04-12 14:29:01

标签: java caching guava ehcache

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

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

这个问题有解决方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

缓存在后台没有为你做任何工作的documentation explains(这实际上是一个功能)。因此,如果您的缓存的吞吐量不足以确保所有所需的密钥始终是最近的,那么您应该创建一个任务(例如使用ScheduledExecutorService),偶尔会刷新所有密钥。

这可能如下所示:

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