0

キャッシングをより簡単にするクールな (imo) T4 テンプレートを作成しています。このテンプレートを作成する際に私が持っているオプションの 1 つは、「一度だけ読み込む」タイプの機能を許可することですが、それがどれほど安全かはわかりません。

基本的には、次のようなことができるようにしたいと思います。

var post=MyCache.PostsCache.GetOrLockLoad(id, ()=>LoadPost(id));

基本的には、キャッシュをロードする必要がある場合に、ブロッキング ロックを配置するようにしますPostsCacheLoadPost()このようにして、関数が完了するまで他のスレッドがブロックされます。これにより、キャッシュ ミスごとに LoadPost が 1 回だけ実行されるようになります。これを行う従来の方法では、キャッシュが空になるたびに LoadPost が実行されます。最初にキャッシュが読み込まれる前に複数のリクエストが来た場合は、複数回実行される可能性があります。

これは合理的なことですか、それともこのような危険または無駄なことのために他のスレッドをブロックしていますか? スレッドロックのオーバーヘッドがほとんどの操作よりも大きいという線に沿って何かを考えていますが、そうではないでしょうか?

誰かがこの種の行為を見たことがありますか?それは良い考えですか、それとも単に危険ですか?

また、あらゆる種類のキャッシュやアプリケーションで実行できるように設計されていますが、最初は ASP.Net の組み込みのキャッシュ メカニズムを対象としています。

4

1 に答える 1

0

理論的には、最初のリクエストの後のリクエストは、とにかくデータ自体をロードするのにかかったであろう時間だけ待機するため、これは問題ないようです。

しかし、それはまだ少し不安定に感じます - 他のスレッドに影響を与えないかもしれない断続的な問題のために最初のローダースレッドが停止した場合はどうなるでしょうか. 各スレッドに個別にロードを試行させる方が安全だと思われます。

また、ロック メカニズムの複雑さとオーバーヘッドも増加しています。ロックを行うほど、(一般的に) デッドロック状態になるリスクが高くなることに注意してください。あなたの場合ですが、LoadPostメソッドでファンキーなロックが行われていない限り、問題にはなりません。

リスクを考えると、ロックなしのオプションを選択したほうがよいと思います。

結局のところ、特定のスレッドの待機時間はほとんど同じです - ロードにかかる時間、または最初のスレッドがロードされるのを待つのに費やされた時間のいずれかです。

並行オプションよりも非並行オプションを使用する場合、特にゲインがわずかに見える場合は、常に少し不快です。

于 2012-12-06T05:45:01.177 に答える