这个问题一般用于缓存,但为了以防万一,我正在使用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执行了多次查询,这是不希望的。
我能想到的解决方案是:
因此,第一个查询将使用旧值更新缓存,所有其他查询将返回旧值(但未过期),并在几秒后,第一个查询将更新正确的值。
我的问题是: 这个问题似乎是缓存中的常见问题,这个问题的常用解决方案是什么?我错过了什么吗?
答案 0 :(得分:1)
一般来说,你不应该自己写缓存,而应该使用缓存加载器。我没有使用过ehcache,但是这个ehcache doc表明你可以在运行时注册或取消注册缓存加载器以便缓存。
这样缓存会锁定正在加载的项目,并在将来的请求中等待计算结果。
您可能还想考虑一个轻量级的Guava CacheBuilder。
希望这有帮助。