MemoryCache
とHttpRuntime.Cache
に違いがあるのではないかと思っています。ASP.NETMVCプロジェクトではどちらが好ましいですか?
私が理解している限り、両方ともスレッドセーフであり、APIは一見してほぼ同じであるため、どちらを使用するかについて違いはありますか?
HttpRuntime.Cache
は、現在のアプリケーションの Cache
を取得します。
MemoryCache
クラスは、ASP.NET Cache
クラスに似ています。
MemoryCache
クラスには、キャッシュにアクセスするための多くのプロパティとメソッドがあり、ASP.NET Cache
クラスを使用したことがある場合は使い慣れています。
HttpRuntime.Cache
とMemoryCache
の主な違いは、後者がASP.NETアプリケーションではない.NET Frameworkアプリケーションで使用できるように変更されていることです。
さらに読むには:
更新:
ユーザーのフィードバックによると、ジョン・デイビスのブログが機能していない場合があります。そのため、記事全体を画像として掲載しています。ご覧ください。
注:はっきりしない場合は、画像をクリックしてください。その後、ブラウザで開きます。それからもう一度クリックしてズームします:)
こちらがジョン・デイビスの記事です。読みやすさを保つために、現在は廃止されたEntLibセクション、イントロ、および結論を省略します。
ASP.NET、またはSystem.Web.dllアセンブリには、キャッシュメカニズムがあります。 Webコンテキストの外部で使用することを意図していませんでしたが、Webの外部で使用することができ、上記のすべての有効期限動作を一種のハッシュテーブルで実行します。
Googleを精査した後、.NETの組み込みキャッシュ機能について議論した多くの人々が、Web以外のプロジェクトでASP.NETキャッシュを使用することに頼ったようです。これは、.NETで最も利用可能で最もサポートされている組み込みキャッシュシステムではなくなりました。 .NET 4には、後で説明するObjectCacheがあります。 Microsoftは、ASP.NETキャッシュがWeb外での使用を目的としていないことを常に強く主張してきました。しかし、多くの人々はまだ.NET 2.0と.NET 3.5にとどまっており、何かを使用する必要があります。MSDNの明確な発言にもかかわらず、これはたまたま多くの人々に有効です。
注:Cacheクラスは、ASP.NETアプリケーションの外部で使用するためのものではありません。 Webアプリケーションにキャッシュを提供するために、ASP.NETで使用するために設計およびテストされました。コンソールアプリケーションやWindowsフォームアプリケーションなど、他の種類のアプリケーションでは、ASP.NETキャッシュが正しく機能しない場合があります。
ASP.NETキャッシュのクラスは、System.Web.dllのSystem.Web.Caching.Cacheです。ただし、単にCacheオブジェクトを更新することはできません。 System.Web.HttpRuntime.Cacheから取得する必要があります。
Cache cache = System.Web.HttpRuntime.Cache;
ASP.NETキャッシュの操作については、MSDN here で説明されています。
Microsoftはついに、最新バージョンの.NET Frameworkに抽象ObjectCacheクラスを実装し、Web以外の設定でメモリ内の目的でObjectCacheを継承および実装するMemoryCache実装を実装しました。
System.Runtime.Caching.ObjectCacheはSystem.Runtime.Caching.dllアセンブリにあります。これは、ASP.NETキャッシュにある基本的に同じ.NET 1.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の推奨(黄色の注意を参照) である必要があります。
ASP.NETキャッシュのインターフェイスに対して、いくつかのわずかな改善が行われました。たとえば、アイテムが追加されたときに、そこにいなくても削除イベントをサブスクライブできる機能、冗長なInsert()が削除され、アイテムはCacheItemで追加できますキャッシュ戦略を定義するイニシャライザを持つオブジェクト、およびContains()が追加されました。
明示的またはスライド式の有効期限を実行するキャッシュ辞書を作成するのは実際には非常に簡単です。 (メモリを消去するためにアイテムを自動削除する場合は、さらに難しくなります。)必要な作業は次のとおりです。
マイクロソフトは、ユーザーベースが依存関係を構築しているため、元の設計をサポートする必要がありますが、それは、それらが優れた設計であることを意味しません。
IDictionary<K,T>
を実装できます。これにより、インターフェイスが辞書インターフェイスとしてより予測しやすくなり、IDictionary <>で動作するヘルパーおよび拡張メソッドからアクセスしやすくなるため、消費がはるかに容易になります。これらの4つのオプションすべての中で、これが私の好みです。この基本的なキャッシュソリューションを実装しました。これまでのところ、それは完全に動作しているようで、既知のバグはありません(下のコメントまたはjon-at-jondavisにコメントがある場合は私に連絡してください!!)、私はそれを必要とする私の小さなサイドプロジェクトのすべてでそれを使用するつもりです基本的なキャッシュ。ここにあります:
Githubリンク: https://github.com/kroimon/ExpirableItemDictionary
古いリンク: ExpirableItemDictionary.Zip
このブログ記事のタイトルは、「Heavy-Duty Caching」ではなく「Simple Caching」を示していることに注意してください。頑丈なものを使いたい場合は、専用のスケールアウトソリューションを検討する必要があります。
MemoryCacheは、それが言うとおり、memoryに保存されたキャッシュです
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