3

Webサイトのすべてのユーザーが使用するグローバルデータをキャッシュするために、MemoryCache(.net 4.0)を使用してキャッシュを実装しています。

私の最初のアプローチ: 単一のオブジェクトを取得するためのキーを持つCustomerオブジェクトのコレクションを保持するKeyedCollectionを保存します。このコレクションには、最大250のそのようなオブジェクトを含めることができます。キャッシュの有効期限が切れるたびに、KeyedCollectionを再構築してキャッシュに追加します。

新しいアプローチ 今、私は、customeridをルックアップキーとして、各Customerオブジェクトをキャッシュに直接保存しないのはなぜかと考えています。したがって、MemoryCache.Defaultには、単一のKeyedCollectionに対して、最大250のそのようなCustomerオブジェクトが含まれます。利点:

  1. キー付きコレクションで別のルックアップを実行することなく、キャッシュから直接Customerオブジェクトを取得するため、より効率的です。
  2. 初めて要求された場合にのみ、新しいCustomerオブジェクトをキャッシュに追加します。キャッシュ全体を事前に構築するのではなく、一種の怠惰な追加です。

パフォーマンスやその他の要因の観点から、一方を他方に対して使用することについて何か考えはありますか?

4

1 に答える 1

3

解決策は、コレクションとしてオブジェクトを操作する必要がある頻度によって異なります。

コレクションとして保存する理由:

  • 各オブジェクトを個別に保存すると、250個のオブジェクトすべてに常にデータが入力される場合、キャッシュ内の各アイテムにが関連付けられるため、より多くのスペースを占有しますCacheItemPolicy。ただし、このケースはおそらくありそうにありません。
  • コレクションでLinqによって使用可能にされた強く型付けされた拡張メソッドはありません。(拡張メソッドは使用可能ですが、MemoryCacheアイテムはとして公開されますKeyValuePair<string, object>)。

個別に保管する理由:

  • 一度に1つのオブジェクトのみ、またはほとんどの場合、作業を行うことになります。
  • コレクション全体ではなく、独自の使用頻度に基づいて、各オブジェクトを作成し、キャッシュから削除する必要があります。

したがって、考えられる使用シナリオを比較し、それに応じて選択してください。たくさんの、などの呼び出しを書いているか、コレクション全体を渡す理由がない限り、.Where個別.Selectに保存する方が良い選択になる可能性があります。

于 2012-05-22T18:02:12.347 に答える