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

Caching 缓存:更新需要一些时间的过期缓存寄存器时返回什么?,caching,ehcache,Caching,Ehcache,这个问题一般是针对缓存的,但以防万一,我使用的是EhcacheforJava 我对缓存中的一些记录使用过期时间,缓存检索的伪代码如下 getCachedCollection(key){ cacheRegister = cache.get(key) if cacheRegister == null then //expired calculated_value = SomeDao.findObjects()//it takes 5 seconds cache.

这个问题一般是针对缓存的,但以防万一,我使用的是EhcacheforJava

我对缓存中的一些记录使用过期时间,缓存检索的伪代码如下

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秒钟内计算出该值,但会对该缓存进行多次查询(因为他们发现该缓存已过期),从而触发对该值的多次计算,或者换句话说,对数据库执行多次查询,这是不需要的

我能想到的解决办法是:

  • 续订值,使过期失效(缓存将存储旧值)
  • 更新缓存值
  • 因此,第一个查询将使用旧值更新缓存,所有其他查询将返回旧值(但未过期),几秒钟后,第一个查询将更新正确的值

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

    一般来说,你不应该自己写缓存,而应该使用缓存加载程序。我没有使用过ehcache,但这表明您可以在运行时为缓存注册或注销缓存加载程序

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

    <>你也可以考虑轻量番石榴。< /P> 希望这有帮助