这个问题一般用于缓存,但以防万一,我使用 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 秒内计算的,但对该缓存进行了几次查询(因为他们发现它已过期),从而触发了对该值的多次计算,或者换句话说,对数据库执行了多次查询,它们是不想要。
我能想到的解决方案是:
- 更新值,使过期失效(缓存将存储旧值)
- 更新缓存值
所以第一个查询将使用旧值更新缓存,所有其他查询将返回旧值(但未过期),几秒钟后,第一个查询将更新正确的值。
我的问题是:这个问题似乎是缓存中的常见问题,这个问题的通常解决方案是什么?我错过了什么吗?