3

ページに項目のリストを表示するコントロールを作成しています。データベースには、(たとえば) 50,000 の項目があり、それらは (多対多に) 1000 ページ (たとえば) 関連付けられています。

データベースから特定のページの完全なアイテムのセットを返すストアド プロシージャを作成する代わりに (つまり、アイテム オブジェクトのリストをハイドレートするためにすべての列)、次のようにしてリストをレンダリングすることを考えています。

  • アプリケーションの起動時に、すべてのリスト アイテムをキャッシュする
  • アイテムのキー値だけを返すように SP を取得する
  • キーのリストをループして、一致するオブジェクトをキャッシュから取得する

予備テストでは、ページ要求ごとに DB からリストをハイドレートするよりも高速に実行されることが示されています。また、各リクエストがプライベート リストを作成するのとは対照的に、各ページ リクエストは既存のオブジェクトを検索するだけなので、全体的なメモリ消費量が少なくなるようです (トラフィックが多く、大きなページがリクエストされた場合、メモリ消費量が非常に高くなります)。

そのため、現在、仲間の開発者とキャッシュの実装方法について議論しています。私たちはいくつかの選択肢を考え出しました。ここであなたの意見をお待ちしております:

  • ASP.NET HttpContext.Current.Cache を使用する
  • 静的/シングルトン オブジェクトを使用する

これらのそれぞれの中で、次のいずれかを選択することもできます。

  1. 各項目オブジェクトを個別にキャッシュする
  2. すべての項目オブジェクトを含むディクショナリ (または同様のリスト) を作成し、ディクショナリをキャッシュします

読み取りパフォーマンスが主な関心事です。メンテナンスは二次的な問題です。GetItems メソッドを防御的に記述して、各アイテムがキャッシュ内にあるかどうかを確認し、そうでない場合は DB から取得してキャッシュに挿入します。

正解がないことはわかっています...すべてに長所と短所があります。私は、人々が上記のいずれかについて共有できる落とし穴があるかどうか、またはアプローチが群を抜いて最高のパフォーマンスを発揮するものであるか、または新しいデータをマージするのが特に難しいかどうかを確認したいと考えています。

ありがとう

4

1 に答える 1

2

私はアプローチをキャッシュします。理由のいくつかは次のとおりです。

  1. メモリが解放されるまでオブジェクトがキャッシュに保持される期間を制御できます。負荷が高い場合、これによりサーバーの応答が向上する可能性があります。
  2. 努力する価値がある場合は、さらに進んで、何らかの分散キャッシュを使用して、アプリ プールのリサイクルに耐えられるようにすることもできます。MemcacheNCacheが思い浮かびます。

私はシングルトンのアプローチが嫌いです。これに Cache を完全に使用できるようになったら、車輪を再発明することになると思います。同時実行性はキャッシュと同じくらい問題になり、分散キャッシュを使用する柔軟性が失われます。どのようなアプローチを取るにしても、将来、従来の Cache から分散型 Cache にシームレスに簡単に変更できるように、Cache からオブジェクトを格納および取得するためのラッパー クラスを作成します。

于 2012-05-01T14:52:12.433 に答える