2017-11-27 18 views
1

私のアプリケーションでは、MemoryCacheを使用していますが、アイテムの有効期限はありません。したがって、項目は、AbsoulteExpirationまたはSlidingExpirationが設定されていないデフォルトポリシーでキャッシュに挿入されます。MemoryCache - アイテムの期限切れを防ぐ

最近、上位サーバーでは、キャッシュに問題が発生しました。これは、以前にキャッシュに挿入された希望の値の代わりにnull値を返したためです。期限切れになる項目だけでなく、有効期限が明示的に設定された項目もキャッシュから削除されることが判明しました。メモリ圧力の下で、値がCacheMemoryLimitおよび/またはPhysicalMemoryLimitを超えた場合、MemoryCacheは他の要素も削除します。

これを防止するにはどうすればよいですか?要素がキャッシュに一度設定されている場合、要素を再度安全にフェッチできることを確認する方法を教えてください。

私はPollingIntervalをいくらか大きな値に設定することを検討しましたが、潜在的な問題を遅らせるだけです(ポーリング間隔は正確な時間ではなく最大時間としてドキュメントで参照されます)。 PhysicalMemoryLimitPercentageを100%に設定しても、物理的にインストールされたメモリを参照し、使用可能な仮想メモリ全体を参照しないため、問題は解決されません。あるいは私は間違っていて、本当に助けになるだろうか?

+1

あなたの質問は、RAMの増加を提案したり、キャッシュからいくつかの値を定期的に削除するよう指示しています。永遠にキャッシュを埋めることはできません。 – lucky

+1

代わりに、代わりに静的なConcurrentDictionaryを使用したいと思いますか? – Magnus

+0

'CacheItemPolicy'には、設定可能な[優先度](https://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.priority(v = vs.110).aspx)プロパティがあります。 「NotRemovable」に変更します。 –

答えて

2

CacheItemPolicyは、NotRemovableに設定できるPriorityプロパティを持っています。

この設定では、キャッシュに追加するデータの量に注意する必要があります。キャッシュにデータを継続的に追加しても、それを削除しないと、最終的にメモリまたはオーバーフローの問題が発生します。

通常、キャッシュはアイテムがキャッシュに存在しなくても許容される場合に使用されます。この場合、値は永続ストレージ(データベースやファイルなど)から再度取得されます。

あなたのコードでは、アイテムが存在する必要があり、別のアプローチ(例えば、コメントに記載されているような静的なConcurrentDictionary)を探しているように思えるかもしれません。

関連する問題