缓存:更新过期的缓存寄存器需要一些时间返回什么?

时间:2013-09-18 00:52:23

标签: caching ehcache

这个问题一般用于缓存,但为了以防万一,我正在使用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. 更新缓存值
  3. 因此,第一个查询将使用旧值更新缓存,所有其他查询将返回旧值(但未过期),并在几秒后,第一个查询将更新正确的值。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

希望这有帮助。