キャッシングをより簡単にするクールな (imo) T4 テンプレートを作成しています。このテンプレートを作成する際に私が持っているオプションの 1 つは、「一度だけ読み込む」タイプの機能を許可することですが、それがどれほど安全かはわかりません。
基本的には、次のようなことができるようにしたいと思います。
var post=MyCache.PostsCache.GetOrLockLoad(id, ()=>LoadPost(id));
基本的には、キャッシュをロードする必要がある場合に、ブロッキング ロックを配置するようにしますPostsCache
。LoadPost()
このようにして、関数が完了するまで他のスレッドがブロックされます。これにより、キャッシュ ミスごとに LoadPost が 1 回だけ実行されるようになります。これを行う従来の方法では、キャッシュが空になるたびに LoadPost が実行されます。最初にキャッシュが読み込まれる前に複数のリクエストが来た場合は、複数回実行される可能性があります。
これは合理的なことですか、それともこのような危険または無駄なことのために他のスレッドをブロックしていますか? スレッドロックのオーバーヘッドがほとんどの操作よりも大きいという線に沿って何かを考えていますが、そうではないでしょうか?
誰かがこの種の行為を見たことがありますか?それは良い考えですか、それとも単に危険ですか?
また、あらゆる種類のキャッシュやアプリケーションで実行できるように設計されていますが、最初は ASP.Net の組み込みのキャッシュ メカニズムを対象としています。