これは若干学問的かもしれませんが、アプリケーションを高速化するためにキャッシュを実装すると、キャッシュミスをどのように処理するのが最適でしょうか? (私の場合は、言語はJavaのだろう、多分答えは、より一般的なことができます)ハンドルキャッシュの欠落:NotFoundException、contains()または `if(null == result)`?
例外をスロー:
ResultType res;
if (Cache.contains(someKey) {
res = Cache.resLookup(someKey);
} else {
res = Cache.resInsert(someKey, SlowDataSource.resLookup(someKey));
}
戻りヌル:
ResultType res;
try {
res = Cache.resLookup(someKey);
} catch (NotFoundException e) {
res = Cache.resInsert(someKey, SlowDataSource.resLookup(someKey));
}
フェッチする前に確認します:
ResultType res;
res = Cache.resLookup(someKey);
if (null == res) {
res = Cache.resInsert(someKey, SlowDataSource.resLookup(someKey));
}
例外をスローすると結局、これはエラーではないようです。キャッシュにcontains()を検索させてから再度データを取得することは、特にこれが毎回発生するので、無駄に見えます。そしてもちろんのnull
をチェックするnull
は有効な結果になることはありませんことを要求...
競争条件、おかげで良い点。しかし、第三でもないのですか? –
はい、3番目にも競合条件があります。読み込み後、読み込んだ直後(nullとして)に、挿入できるようになる前にキャッシュに置かれたエントリを上書きすることが条件です。 – Chii
3番目の例では、競合状態は適切ですが、同じ結果が見つかるはずなので、キャッシュに正しい結果がない方法はないため、どのようにして誰に悪影響を及ぼすかはわかりません。 – tomjen