タグ付けされた質問 「memorycache」

9
.NET MemoryCacheを適切に使用するためのロックパターン
このコードには同時実行の問題があると思います: const string CacheKey = "CacheKey"; static string GetCachedData() { string expensiveString =null; if (MemoryCache.Default.Contains(CacheKey)) { expensiveString = MemoryCache.Default[CacheKey] as string; } else { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(20)) }; expensiveString = SomeHeavyAndExpensiveCalculation(); MemoryCache.Default.Set(CacheKey, expensiveString, cip); } return expensiveString; } 並行性の問題の理由は、複数のスレッドがnullキーを取得してから、データをキャッシュに挿入しようとする可能性があるためです。 このコードの同時実行性を証明する最も簡単でクリーンな方法は何でしょうか?私はキャッシュ関連のコード全体で良いパターンに従うのが好きです。オンライン記事へのリンクは非常に役立ちます。 更新: @Scott Chamberlainの回答に基づいてこのコードを思いつきました。誰かがこれでパフォーマンスまたは同時実行の問題を見つけることができますか?これがうまくいけば、コードやエラーの多くの行を節約できます。 …


11
MemoryCacheをクリアする方法は?
MemoryCacheクラスを使用してキャッシュを作成しました。いくつかのアイテムを追加しましたが、キャッシュをリロードする必要があるときは、最初にそれをクリアしたいと思います。これを行う最も速い方法は何ですか?すべてのアイテムをループして一度に1つずつ削除する必要がありますか、それとももっと良い方法がありますか?

7
MemoryCacheスレッドセーフ、ロックは必要ですか?
手始めに、以下のコードはスレッドセーフではないことがわかっているので、それを捨てさせてください(修正:そうかもしれません)。私が苦労しているのは、テストで実際に失敗する可能性のある実装を見つけることです。現在、大規模なWCFプロジェクトをリファクタリングしています。このプロジェクトでは、(ほとんどの場合)静的データをキャッシュし、SQLデータベースからデータを取り込む必要があります。少なくとも1日に1回は有効期限が切れて「更新」する必要があるため、MemoryCacheを使用しています。 以下のコードはスレッドセーフであってはならないことは知っていますが、高負荷で失敗することはなく、問題を複雑にするために、グーグル検索は両方の方法で実装を示しています(ロックの有無と必要かどうかの議論が組み合わされています。 マルチスレッド環境でのMemoryCacheの知識がある人は、削除の呼び出し(めったに呼び出されませんが、その要件)が取得/再入力中にスローされないように、必要に応じてロックする必要があるかどうかを明確に教えてくれますか? public class MemoryCacheService : IMemoryCacheService { private const string PunctuationMapCacheKey = "punctuationMaps"; private static readonly ObjectCache Cache; private readonly IAdoNet _adoNet; static MemoryCacheService() { Cache = MemoryCache.Default; } public MemoryCacheService(IAdoNet adoNet) { _adoNet = adoNet; } public void ClearPunctuationMaps() { Cache.Remove(PunctuationMapCacheKey); } public IEnumerable GetPunctuationMaps() { if …

7
MemoryCacheは構成のメモリ制限に従わない
私は、.NET 4.0で働いているMemoryCacheのアプリケーションにクラスと最大キャッシュサイズを制限しようとしているが、私のテストでは、キャッシュが実際の制限に従うことであることを表示されません。 私はMSDNによると、キャッシュサイズを制限することになっている設定を使用しています。 CacheMemoryLimitMegabytes:オブジェクトのインスタンスが拡張できる最大メモリサイズ(メガバイト単位)。」 PhysicalMemoryLimitPercentage: "キャッシュが使用できる物理メモリの割合。1から100までの整数値で表されます。デフォルトはゼロです。これは、 MemoryCacheインスタンスが、にインストールされているメモリの量に基づいて独自のメモリ1を管理することを示します。コンピューター。" 1.これは完全に正しいわけではありません。4未満の値は無視され、4に置き換えられます。 キャッシュをパージするスレッドはx秒ごとに起動され、ポーリング間隔やその他の文書化されていない変数にも依存するため、これらの値は概算であり、ハード制限ではないことを理解しています。ただし、これらの差異を考慮しても、テストアプリでCacheMemoryLimitMegabytes とPhysicalMemoryLimitPercentageを一緒に、または単独で設定した後、最初のアイテムがキャッシュから削除されると、キャッシュサイズに非常に一貫性がなくなります。確かに、各テストを10回実行し、平均値を計算しました。 これらは、3GBのRAMを搭載した32ビットのWindows 7PCで以下のサンプルコードをテストした結果です。キャッシュのサイズは、各テストでCacheItemRemoved()を最初に呼び出した後に取得されます。(キャッシュの実際のサイズはこれより大きくなることを認識しています) MemLimitMB MemLimitPct AVG Cache MB on first expiry 1 NA 84 2 NA 84 3 NA 84 6 NA 84 NA 1 84 NA 4 84 NA 10 84 10 20 81 10 30 81 10 39 82 …
87 c#  .net  caching  memorycache 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.