【问题标题】:Forced Non-blocking refresh of Cache强制非阻塞刷新缓存
【发布时间】:2017-09-08 09:46:19
【问题描述】:

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

使用 Guava,如果我同时使用 refreshAfterWrite(4, Minute) 和 expireAfterWrite(5, Minute) ,我可以解决经常查询的键的这个问题。但是,我很少有很少查询的键,对于它们来说,请求可能必须等待加载。

这个问题有解决办法吗?

【问题讨论】:

  • 缓存保存瞬态的、可重新计算的数据,这些数据通常比完整数据集小得多。所以删除不常用的条目是理想的。如果您想要完整的数据集,您可能需要安排一个线程重新加载并交换地图。

标签: java caching guava ehcache


【解决方案1】:

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

此功能允许您计划定期刷新缓存中存在的(部分)密钥集。请注意,在您刷新整个密钥集的情况下,根据密钥集大小和刷新所有条目所需的时间,这可能会给您的系统带来相当大的负载。

【讨论】:

    【解决方案2】:

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

    这可能看起来像:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2011-04-21
      • 2016-05-18
      相关资源
      最近更新 更多