2012-04-03 6 views
17

私は多くの情報をキャッシュするウェブサイトを持っています。私はasp.netキャッシュ内のものを格納することについて矛盾する情報を見ている。asp.netでアイテムを保存/取得する最も効率的な方法は何ですかhttpContext.Cache

Dictionary<string, List<Car>> mydictionary; 

私は「MyDictionary」などの文字列キーで全体を格納し、私は、オブジェクトを引き出したら、ドリルダウンすることができます。たとえば

は、私はこのデータ構造を持って言うことができます。

HttpContext.Cache.Add("MyDictionary", 
    mydictionary, 
    null, 
    Cache.NoAbsoluteExpiration, 
    new TimeSpan(10, 0, 0), 
    CacheItemPriority.Normal, 
    null); 

var myDict = HttpContext.Cache["MyDictionary"] as Dictionary<string, List<Car>>; 

私が行うことができ、他のことは、それを打破し、キャッシュに分けて、私の辞書に各項目を保存(キャッシュ与えられたが、とにかく辞書である)です。

Dictionary<string, List<Car>> mydictionary; 

foreach (var item in mydictionary.Keys) 
{ 
     HttpContext.Cache.Add(item, mydictionary[item], null, Cache.NoAbsoluteExpiration, new TimeSpan(10, 0, 0), CacheItemPriority.Normal, null); 
} 

var myitem = "test"; 
var myDict = HttpContext.Cache[myItem] as List<Car>; 

パフォーマンスの含意は非常に異なるだろう

+4

キャッシュは、頻繁に使用される「高価な」オブジェクトを再作成するコスト(つまり、再作成のコストがキャッシュのコストを上回る)を節約する手段であることを覚えておいてください。キャッシュする価値がある場合は、キャッシュにLRUルールを適用してパフォーマンスを最大化します。すべてのエントリを1つのキャッシュエントリ( 'MyDictionary')に入れると、LRUは無効になり、MyDictionaryの保持が他のエントリを保持するより効率が悪いとキャッシュが判断した場合、 – Will

答えて

14

私は既存のものが「何か」を捕捉しているが、「理由」は十分ではないと感じるので、ここで追加の回答を追加してください。

個別のエントリをキャッシュに別々に保存するのが最適なのは、perfとほとんど関係がありません。代わりに、システムが適切なメモリ管理を実行できるようにする必要があります。

ASP.NETキャッシュに多くのロジックがあり、メモリが不足したときに何をすべきかを把握しています。最終的には、いくつかのアイテムを追い出す必要があり、可能な限り破壊的な方法でこれを行う必要があります。どのアイテムを蹴り出すかは、最近アクセスしたかどうかによって大きく異なります。キャッシング時に渡されるフラグのような他の要因があります。例えばあなたはアイテムを取り外し不能にすることができ、決して追い出されることはありません。

質問に戻ると、辞書全体を1つのアイテムとして保存する場合、ASPには2つのオプションしか残っていません。NETのメモリマネージャー:全体のものを生かして、またはすべてを殺す。つまり、キャッシュに「ホット」アイテムが残っているというメリットが完全に失われ、めったにアクセスされていないメモリ混載アイテムが追い出されます。言い換えれば、キャッシング細分化のあらゆるレベルを失います。

もちろん、使用頻度の低いアイテムを削除するために、独自のスキームを辞書に実装することもできます。しかし、その時点でホイールを再発明しているため、新しいホイールはシステムの残りの部分と調整されないため、うまく機能しません。

3

を抜いて(私はすべてがとにかくメモリ内にあると仮定しています?与えられた)、第二の方法は、より良いです。

多くのオブジェクトを考慮する必要があると考えてください。あなたが1つの価値を得なければならないたびに、あなたはそれを取得する必要があります。それは、entyre辞書を掴むのではなく、あなたが望むものを得ることです。

これは、最も頻繁に使用されるアイテム(私がまだ覚えている場合はMRU)に優先順位を付けるためにキャッシュで使用されるアルゴリズムについてのものではありません。

最終的な実装として採用する前に、パフォーマンスの向上を測定することをお勧めします。

7

あなたが言うように、これには2つの反対意見があります。

キャッシュエントリは、必要に応じて最も細かいレベルで格納する必要があります。それは、辞書を使用するたびに辞書内のすべての項目を使用して辞書レベルに保存するということです。

辞書から項目を1つだけ使用していて、辞書を歩いていない場合は、個々のレベルに格納します。

したがって、コレクション全体を1つの単位として扱う場合、コレクションを1つの単位としてキャッシュします。コレクションにランダムにアクセスし、一度に特定のアイテムだけが必要な場合は、それを単一のユニットであるレベルに保管します。

関連する問題