.NET 2.0 を実行している Web サイトがあり、ASP.Net HttpRuntime.Cache の使用を開始して、頻繁なデータ ルックアップの結果を保存し、データベース アクセスを削減しました。
スニペット:
lock (locker)
{
if (HttpRuntime.Cache[cacheKey] == null)
{
HttpRuntime.Cache.Insert(cacheKey, GetSomeDataToCache(), null, DateTime.Today.AddDays(1), Cache.NoSlidingExpiration);
}
return ((SomeData)HttpRuntime.Cache[cacheKey]).Copy();
}
キャッシュを見たいときはいつでも悲観的にロックしています。ただし、ロックのオーバーヘッドが発生しないように、代わりにキャッシュ値を確認した後にロックすることを提案するさまざまなブログが Web に投稿されているのを見てきました。チェック後に別のスレッドがキャッシュに書き込んだ可能性があるため、これは正しくないようです。
最後に私の質問は、これを行う「正しい」方法は何ですか? 正しいスレッド同期オブジェクトを使用していますか? ReaderWriterLockSlim() は認識していますが、.NET 2.0 を実行しています。