如何防止加载缓存中不存在的值多次同时在高效的方式?如何防止多次加载非缓存值?
典型的高速缓存的使用是以下伪代码:
Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = loadFromService(key);
cache.set(key,value);
}
return value;
}
问题:值从服务(数据库,web服务,RemoteEJB或其他任何东西)加载之前的第二呼叫可以在相同的时间内进行,这将使该值再次加载。
例如,当我为用户X缓存所有项目,并且此用户经常被查看并且有许多项目时,很可能会同时调用其所有项目的负载,从而导致服务器负载过重。
我可以让get
功能同步,但这会迫使其他搜索等待,没有多大意义。我可以为每个密钥创建新锁,但我不知道是否在Java(这部分是语言特定的,我将其标记为java
的原因)中管理如此大量的锁是个好主意, 。
或者还有另一种方法可以使用?如果是这样,那么效率最高的是什么?
你正在过分认真地对待这件事。除非从服务中加载数据的时间非常长,否则这不会成为问题。 – pablochan
我有一些外部的EJB代码,在测试环境下可能需要长达20秒,所以我怕发生10或20个并发请求会发生什么 –