2012-09-26 3 views
18

私は、WCFサービスの要求レベルでキャッシュを実装しようとしています。このサービスに対する各要求は、多数のデータベース呼び出しを実行します。複数のデータコレクターを考える。前のデータコレクタによってすでに取得された情報に、あるデータコレクタがアクセスできるようにする必要があります。メモリキャッシュまたはコンカレントディクショナリ?

私は、リクエストごとに特定のインスタンスを作成することで、このために新しい.Net 4.0メモリキャッシュを使用しようとしていました。

これは良い考えですか?または、単にDictionaryオブジェクトを使用する必要がありますか?

BTW:データ収集は並行して行われるため、ロックに関する複雑さは増しますが、同時にコンカレントコレクションも使用できます。

+0

更新 - システムレベルのメモリキャッシュよりも私のニーズが優れているため、コンカレントコレクションを使用することにしました。 –

+0

私はMemoryCacheクラスを理解しているので、それはプロセスレベルのキャッシュ.. – Legends

+0

、またはAppDomainレベルでさえ、テストされていません。 – Legends

答えて

25

何らかの種類の期限切れロジックが必要ない場合は、コンカレントコレクションを使用することをお勧めします。 ConcurrentDictionaryLazyクラスを組み合わせると、single entry caching mechanismを簡単に実装できます。 LazyとConcurrentDictionaryの組み合わせについては、anotherというリンクがあります。

アイテムを期限切れにする必要がある場合は、内蔵メモリキャッシュを使用して、double-checked locking patternを実装してキャッシュアイテムの単一取得を保証してください。 Locking pattern for proper use of .NET MemoryCache

+0

Ok - 私は同じ行で考えていたが、私はまだ "なぜ?"それの。 MemoryCacheは、AddOrGetのようなキャッシュ固有の機能を私に提供します。並行コレクションに移動すると、それを失います。 有効期限機能は、コンカレントコレクションとメモリキャッシュのどちらかを選択する唯一の理由ですか? –

+1

@zync LazyでConcurrentDictionaryを使用するという考えは、アプリケーション・ドメインごとにキャッシュ項目を一度取得し、決して変更しないようにすることです。これが当てはまらない場合は、MemoryCacheが優れています。ただし、単一エントリ検索ロジックが必要な場合は、MemoryCache.AddOrGetExistingメソッドに値が必要なため、この値を取得しながらロックを実装する必要があるため、ConcurrentDictionaryを使用する方が適切です。しかし、ConcurrentDictionary.GetOrAdd(TKeyキー、Func valueFactory)をLazyと組み合わせると、ロックするものはすべてフレームワークライブラリに残されます。 –

+3

ちなみに、サービスが開始される前にキャッシュ項目が適切に定義されている(つまり動的にキャッシュされていない)場合、キャッシュ内のすべてのデータの読み込みを一度に行うことができます。サービスクラスの静的コンストラクタを使用して、 。これは、静的コンストラクターがアプリケーションドメインごとに1回実行され、そのタイプのインスタンスコンストラクターが実行される前に実行されることが保証されているため、より優れています。それは単純だ。 –

関連する問題