いずれかの間に違いがある場合、私は思ったんだけどMemoryCache
とHttpRuntime.Cache
1はASP.NET MVCプロジェクトで好まれ、?
私の知る限り、どちらもスレッドセーフであり、APIは一見同じですが、どちらを使用するかには違いがありますか?
回答:
HttpRuntime.Cache
Cache
現在のアプリケーションのを取得します。
このMemoryCache
クラスはASP.NETCache
クラスに似ています。
このMemoryCache
クラスには、ASP.NETCache
クラスを使用したことがある場合によく知られている、キャッシュにアクセスするための多くのプロパティとメソッドがあります。
主な違いHttpRuntime.Cache
とは、MemoryCache
後者は、ASP.NETアプリケーションではない.NET Frameworkアプリケーションによってそれが使用できるように変更されたことです。
追加の読み物について:
更新:
ユーザーからのフィードバックによると、Jon davisブログが機能しないことがあるので、記事全体を画像として掲載しましたので、ご覧ください。
注:はっきりしない場合は、画像をクリックしてください。その後、ブラウザで開きます。もう一度クリックしてズームします:)
これがJonDavisの記事です。読みやすさを維持するために、現在は廃止されているEntLibセクション、イントロ、および結論を切り取っています。
ASP.NET、またはSystem.Web.dllアセンブリには、キャッシュメカニズムがあります。Webコンテキストの外部で使用することを意図したものではありませんが、Webの外部で使用することはでき、ある種のハッシュテーブルで上記のすべての有効期限動作を実行します。
Googleを精査した後、.NETの組み込みキャッシュ機能について議論したかなりの数の人々が、非WebプロジェクトでASP.NETキャッシュを使用することに頼ったようです。これは、.NETで最も利用可能で、最もサポートされている組み込みキャッシュシステムではなくなりました。.NET 4にはObjectCacheがありますが、これについては後で説明します。Microsoftは、ASP.NETキャッシュがWebの外部での使用を目的としていないことを常に断固として主張してきました。しかし、多くの人々はまだ.NET2.0と.NET3.5で立ち往生しており、何かを操作する必要があります。MSDNが明確に述べているにもかかわらず、これは多くの人々にとってうまくいきます。
注:Cacheクラスは、ASP.NETアプリケーションの外部での使用を目的としたものではありません。これは、Webアプリケーションのキャッシュを提供するためにASP.NETで使用するために設計およびテストされました。コンソールアプリケーションやWindowsフォームアプリケーションなどの他の種類のアプリケーションでは、ASP.NETキャッシュが正しく機能しない場合があります。
ASP.NETキャッシュのクラスは、System.Web.dllのSystem.Web.Caching.Cacheです。ただし、キャッシュオブジェクトを単純に新規作成することはできません。System.Web.HttpRuntime.Cacheから取得する必要があります。
Cache cache = System.Web.HttpRuntime.Cache;
ASP.NETキャッシュの操作については、MSDNのここに記載されています。
Microsoftはついに、最新バージョンの.NET Frameworkに抽象ObjectCacheクラスを実装し、非Web設定でメモリ内の目的でObjectCacheを継承して実装するMemoryCache実装を実装しました。
System.Runtime.Caching.ObjectCacheは、System.Runtime.Caching.dllアセンブリにあります。これは、ASP.NETキャッシュにあるのと基本的に同じ.NET1.0スタイルのインターフェイスを宣言する抽象クラスです。System.Runtime.Caching.MemoryCache
はObjectCacheのメモリ内実装であり、ASP.NETキャッシュと非常によく似ていますが、いくつかの変更があります。
スライド式の有効期限を持つアイテムを追加するには、コードは次のようになります。
var config = new NameValueCollection();
var cache = new MemoryCache("myMemCache", config);
cache.Add(new CacheItem("a", "b"),
new CacheItemPolicy
{
Priority = CacheItemPriority.NotRemovable,
SlidingExpiration=TimeSpan.FromMinutes(30)
});
ASP.NETキャッシュとは異なり、MemoryCacheオブジェクトインスタンスをインスタンス化できます。
注:静的である必要はありませんが、静的である必要があります。これは、Microsoftの推奨事項です(黄色の注意を参照)。
アイテムが追加されたときに必ずしも存在しなくても削除イベントをサブスクライブする機能、冗長なInsert()が削除された、アイテムをCacheItemで追加できるなど、ASP.NETキャッシュのインターフェイスに対していくつかのわずかな改善が行われました。キャッシュ戦略を定義する初期化子を持つオブジェクト、およびContains()が追加されました。
明示的またはスライド式の有効期限を実行するキャッシングディクショナリを作成するのは、実際には非常に簡単です。(メモリをクリアする目的でアイテムを自動削除する場合は、非常に難しくなります。)必要な作業は次のとおりです。
マイクロソフトは、ユーザーベースが元のデザインに依存しているため、元のデザインをサポートする必要がありますが、それはそれらが優れたデザインであることを意味するものではありません。
IDictionary<K,T>
。これにより、そのインターフェイスが辞書インターフェイスとしてより予測可能になるため、消費がはるかに簡単になります。さらに、IDictionary <>で機能するヘルパーや拡張メソッドにアクセスしやすくなります。これら4つのオプションすべての中で、これが私の好みです。この基本的なキャッシュソリューションを実装しました。これまでのところ、完全に機能しているようで、既知のバグはありません(コメントがある場合は、以下のコメントまたはjon-at-jondavisまでご連絡ください!!)。必要なすべての小規模なサイドプロジェクトで使用する予定です。基本的なキャッシュ。ここにあります:
Githubリンク:https://github.com/kroimon/ExpirableItemDictionary
古いリンク:ExpirableItemDictionary.zip
このブログ記事のタイトルは、「ヘビーデューティーキャッシング」ではなく「シンプルキャッシング」を示していることに注意してください。ヘビーデューティーなものに取り掛かりたい場合は、専用のスケールアウトソリューションを検討する必要があります。
MemoryCacheとは、メモリに保存されているキャッシュのことです。
HttpRuntime.Cache(http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v = vs.100).aspxおよびhttp://msdn.microsoft.com/en-を参照) us / library / system.web.caching.cache.aspx)は、アプリケーションで構成したものに依存します。
たとえば、「ASP.NET 4.0:カスタム出力キャッシュプロバイダーの作成」 http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cacheを参照してください。 -providers.aspx