【问题标题】:Caching: What to return while updating an expired cache register that takes some time?缓存:更新一个需要一些时间的过期缓存寄存器时要返回什么?
【发布时间】:2013-09-22 14:52:01
【问题描述】:

这个问题一般用于缓存,但以防万一,我使用 EHcache for Java。

我对缓存中的一些记录使用了过期时间,缓存检索的伪代码是这样的。

getCachedCollection(key){
   cacheRegister = cache.get(key)

   if cacheRegister == null then //expired
      calculated_value = SomeDao.findObjects()//it takes 5 seconds
      cache.put(key,calculated_value)
      return calculated_value
   else
      return cacheRegister.value
   end
}

计算值,需要 5 秒或更长时间,我无法控制这个时间。

问题是,虽然该值是在 5 秒内计算的,但对该缓存进行了多次查询(因为他们发现它已过期),触发了对该值的多次计算,或者换句话说,对 db 执行了多次查询,这是不希望的。

我能想到的解决办法是:

  1. 更新值,使过期失效(缓存将存储旧值)
  2. 更新缓存值

所以第一个查询将使用旧值更新缓存,所有其他查询将返回旧值(但未过期),几秒钟后,第一个查询将更新正确的值。

我的问题是: 这个问题似乎是缓存中的一个常见问题,这个问题的通常解决方案是什么?我错过了什么吗?

【问题讨论】:

    标签: caching ehcache


    【解决方案1】:

    一般来说,您永远不应该自己写入缓存,而应该使用缓存加载器。我没有使用过 ehcache,但这个 ehcache doc 表明您可以在运行时注册或取消注册缓存加载器。

    这样缓存会锁定正在加载的项目并在以后的请求中等待计算结果。

    您可能还想考虑轻量级 Guava 的 CacheBuilder

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多