Web アプリケーションにキャッシュを作成したいと考えています。これにより、最上位層 (MVC) が、下位層 (サービスと DB) から取得した値を永続化して、不要な要求を回避できるようになります。キャッシュに保存したいデータは Web サイトのすべてのページで必要になるため、このキャッシュはリクエストの量を大幅に削減することを目的としています。アイデアは、多くのスレッドがコレクションからデータを読み取り、1 つのスレッドがそれをクリアして、キャッシュの有効期限が切れた後に新しいデータを取得するというものです。これは、コレクションが頻繁な読み取り操作とまれな書き込み操作に使用されることを意味します。
私にとっての問題は、これらの目的に適したクラスを選択することです。.NET 4 で導入されたからの同時実行クラスのセットについて読みました。またはSystem.Collections.Concurrent
を使用する必要はまったくありませんが、とのいずれかを選択する必要があります。 ConcurrentQueue
ConcurrentStack
BlockingCollection
ConcurrentBag
ConcurrentDictionary
ConcurrentBag
この場合の最良の解決策のようです。しかし、私はこの記事でその並行辞書を読みました
...読み取り操作では完全にロックフリーです。このように、辞書からの読み取りが最も頻繁な操作であるシナリオに最適化されています。
おそらく最善の解決策は、ConcurrentDictionary<int, MyTypeOfObj>
代わりに使用することですか?それとも、私は並行型をまったく必要とせず、単純List
に仕事をするのでしょうか? おそらく、キャッシュの更新時に操作をロックすることができれば、それでよいでしょう。しかし、 simple を使用することlock
は望ましくありません。
アドバイスや説明をいただければ幸いです。
アップデート
キャッシュは、アウトレットのマップ ポイントを格納するために使用されます。アウトレットのセットは非常に安定していますが、それらを追加するための UI があるはずなので、挿入操作は非常にまれです。タイムアウト後に基になるレイヤーからコレクション全体を取得し、挿入操作を実行する方が簡単な場合があります。検索も必要ありません。読み取りは単純な列挙を意味します。