効率的な方法で、キャッシュに存在しない値を同時に何度もロードするのを防ぐ方法は?
一般的なキャッシュの使用法は、次の疑似コードです。
Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = loadFromService(key);
cache.set(key,value);
}
return value;
}
問題: 値がサービス (データベース、WebService、RemoteEJB など) からロードされる前に、2 回目の呼び出しが同時に行われる可能性があり、これにより値が再度ロードされます。
たとえば、ユーザー X のすべてのアイテムをキャッシュしていて、このユーザーが頻繁に表示され、多くのアイテムを持っている場合、すべてのアイテムの負荷を同時に呼び出す可能性が高く、サーバーに大きな負荷がかかります。
get
関数をsynchronizedにすることもできましたが、これにより他の検索が待たされることになり、あまり意味がありません。すべてのキーに対して新しいロックを作成することはできますが、 Javaでこのような多数のロックを管理するのが良い考えかどうかはわかりません(この部分は言語固有であり、タグを付けた理由ですjava
)。
または、私が使用できる別のアプローチがありますか?もしそうなら、何が最も効率的でしょうか?