0

这个问题一般用于缓存,但以防万一,我使用 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 秒内计算的,但对该缓存进行了几次查询(因为他们发现它已过期),从而触发了对该值的多次计算,或者换句话说,对数据库执行了多次查询,它们是不想要。

我能想到的解决方案是:

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

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

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

4

1 回答 1

1

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

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

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

希望这可以帮助。

于 2013-09-23T13:25:40.963 回答