ページに項目のリストを表示するコントロールを作成しています。データベースには、(たとえば) 50,000 の項目があり、それらは (多対多に) 1000 ページ (たとえば) 関連付けられています。
データベースから特定のページの完全なアイテムのセットを返すストアド プロシージャを作成する代わりに (つまり、アイテム オブジェクトのリストをハイドレートするためにすべての列)、次のようにしてリストをレンダリングすることを考えています。
- アプリケーションの起動時に、すべてのリスト アイテムをキャッシュする
- アイテムのキー値だけを返すように SP を取得する
- キーのリストをループして、一致するオブジェクトをキャッシュから取得する
予備テストでは、ページ要求ごとに DB からリストをハイドレートするよりも高速に実行されることが示されています。また、各リクエストがプライベート リストを作成するのとは対照的に、各ページ リクエストは既存のオブジェクトを検索するだけなので、全体的なメモリ消費量が少なくなるようです (トラフィックが多く、大きなページがリクエストされた場合、メモリ消費量が非常に高くなります)。
そのため、現在、仲間の開発者とキャッシュの実装方法について議論しています。私たちはいくつかの選択肢を考え出しました。ここであなたの意見をお待ちしております:
- ASP.NET HttpContext.Current.Cache を使用する
- 静的/シングルトン オブジェクトを使用する
これらのそれぞれの中で、次のいずれかを選択することもできます。
- 各項目オブジェクトを個別にキャッシュする
- すべての項目オブジェクトを含むディクショナリ (または同様のリスト) を作成し、ディクショナリをキャッシュします
読み取りパフォーマンスが主な関心事です。メンテナンスは二次的な問題です。GetItems メソッドを防御的に記述して、各アイテムがキャッシュ内にあるかどうかを確認し、そうでない場合は DB から取得してキャッシュに挿入します。
正解がないことはわかっています...すべてに長所と短所があります。私は、人々が上記のいずれかについて共有できる落とし穴があるかどうか、またはアプローチが群を抜いて最高のパフォーマンスを発揮するものであるか、または新しいデータをマージするのが特に難しいかどうかを確認したいと考えています。
ありがとう