web-dev-qa-db-ja.com

C#/。Netでのキャッシュ

C#でキャッシュを実装するための最良の方法は何ですか?指定された.NETクラスなどを使用する可能性はありますか?おそらく、いくつかのエントリを削除する辞書のようなものです。エントリが大きすぎると、ガベージコレクタによって削除されないエントリはどこにあるのでしょうか。

30

ASP.NETを使用している場合は、Cacheクラス(System.Web.Caching)。

良いヘルパークラスを次に示します。 c-cache-helper-class

Windowsフォームアプリでのキャッシュを意味する場合は、何をしようとしているか、データをどこでキャッシュしようとしているかによって異なります。

特定のメソッドのWebサービスの背後にキャッシュを実装しました
System.Web.Cachingオブジェクト。

ただし、キャッシングアプリケーションブロックも確認することをお勧めします。 ( こちらを参照) .NET Framework 2.0のエンタープライズライブラリの一部です。

15
Bravax

.NET 4以降を使用している場合は、 MemoryCache クラスを使用できます。

27
Muaddib

MemoryCache はフレームワークで開始するのに適した場所ですが、オープンソースライブラリを検討することもできます LazyCache これはメモリキャッシュよりもシンプルなAPIを持ち、組み込みの開発者向けのその他の機能と同様にロックも可能です。 nugetでも利用できます。

例を挙げましょう:

// Create our cache service using the defaults (Dependency injection ready).
// Uses MemoryCache.Default as default so cache is shared between instances
IAppCache cache = new CachingService();

// Declare (but don't execute) a func/delegate whose result we want to cache
Func<ComplexObjects> complexObjectFactory = () => methodThatTakesTimeOrResources();

// Get our ComplexObjects from the cache, or build them in the factory func 
// and cache the results for next time under the given key
ComplexObject cachedResults = cache.GetOrAdd("uniqueKey", complexObjectFactory);

最近、この記事を書いた ドットネットでのキャッシュの開始 役に立つかもしれません。

(免責事項:私はLazyCacheの著者です)

3
alastairtree

ObjectCacheを使用できます。

http://msdn.Microsoft.com/en-us/library/system.runtime.caching.objectcache.aspx を参照してください

2
Yaeiou2k
1

.NETで提供されるキャッシュクラスは便利ですが、大きな問題があります。GCを強制終了しない限り、オブジェクトの大量のデータ(数千万以上)を長期間保存することはできません。数千のオブジェクトをキャッシュするとうまく機能しますが、数百万に移動してGEN2に伝播するまで保持する瞬間-システムが低メモリしきい値に達してGCがスイープする必要がある場合、GCの一時停止が最終的に顕著になりますすべての世代。

実用性はこれです-数十万のインスタンスを保存する必要がある場合-MSキャッシュを使用します。オブジェクトが2フィールドか25フィールドかは関係ありません-参照の数についてです。

一方で、最近一般的な大容量のRAM、つまり64 GBを使用する必要がある場合があります。そのために、100%マネージドメモリマネージャーとその上にあるキャッシュを作成しました。

このソリューションでは、GCに負担をかけることなく、インプロセスで300,000,000個のオブジェクトをメモリ内に簡単に格納できます。これは、データを大きな(250 mb)byte []セグメントに格納するためです。

コードは次のとおりです。 NFX Pile (Apache 2.0)

そしてビデオ: NFX Pile Cache-Youtube

1
itadapter DKh

あなたの質問はさらに明確にする必要があります。 C#はフレームワークではなく言語です。キャッシングを実装するフレームワークを指定する必要があります。 ASP.NETで実装することを検討する場合、それはCacheから何を望むかに完全に依存します。インプロセスキャッシュ(アプリケーションのヒープ内にデータを保持します)とアウトプロセスキャッシュ(この場合、Amazon Elasticキャッシュサーバーなどのヒープ以外のメモリにデータを保存できます)を決定できます。また、クライアントキャッシングとサーブサイドキャッシングのどちらを選択するかについても決定があります。通常、ソリューションでは、さまざまなデータをキャッシュするためのさまざまなソリューションを開発する必要があります。 4つの要素(アクセシビリティ、永続性、サイズ、コスト)に基づいているため、必要なソリューションを決定する必要があります。

0
Meysam