我想要一个缓存刷新策略,如果缓存值在5分钟后变得陈旧,我需要在第4分钟触发刷新值,以便新值在第5分钟可用,并且任何尝试获取数据的请求第5分钟既不必等待负载也不得过时数据。
对于Guava,如果我一起使用refreshAfterWrite(4,Minute)和expireAfterWrite(5,Minute),我可以为经常查询的键解决这个问题。但是我很少查询很少的密钥,对于他们来说,请求可能需要等待加载。
这个问题有解决方法吗?
答案 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);