如何以有效的方式防止多次同时加载缓存中不存在的值?
典型的缓存用法是以下伪代码:
Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = loadFromService(key);
cache.set(key,value);
}
return value;
}
问题:在从服务(数据库、WebService、RemoteEJB 或其他任何东西)加载值之前,可能会同时进行第二次调用,这将使值再次加载。
比如我在缓存用户X的所有item,这个用户经常被查看,并且有很多item,很有可能同时调用他所有item的load,导致服务器负载过重。
我可以使get
功能同步,但这会迫使其他搜索等待,没有多大意义。我可以为每个键创建新锁,但我不知道在Java中管理如此大量的锁是否是个好主意(这部分是特定于语言的,我将其标记为的原因java
)。
还是我可以使用另一种方法?如果是这样,什么是最有效的?