HttpRuntime.Cache
bekommt das Cache
für die aktuelle anwendung.
Die MemoryCache
Klasse ähnelt der ASP.NET- Cache
Klasse.
Die MemoryCache
Klasse verfügt über viele Eigenschaften und Methoden für den Zugriff auf den Cache, die Ihnen bekannt sind, wenn Sie die ASP.NET- Cache
Klasse verwendet haben.
Der Hauptunterschied zwischen HttpRuntime.Cache
und MemoryCache
besteht darin, dass letzteres geändert wurde, damit es von .NET Framework-Anwendungen verwendet werden kann, die keine ASP.NET-Anwendungen sind.
Für zusätzliche Lektüre:
Update:
Laut dem Feedback der Benutzer funktioniert der Blog von Jon Davis manchmal nicht. Daher habe ich den gesamten Artikel als Bild eingefügt. Bitte sehen Sie das.
Hinweis: Wenn es nicht klar ist, klicken Sie einfach auf das Bild. Danach wird es in einem Browser geöffnet. Klicken Sie dann erneut darauf, um zu zoomen :)
Hier ist der Artikel von Jon Davis. Um die Lesbarkeit zu gewährleisten, schneide ich den mittlerweile veralteten EntLib-Abschnitt, das Intro sowie die Schlussfolgerung aus.
ASP.NET-Cache
ASP.NET oder die Assembly System.Web.dll verfügt über einen Caching-Mechanismus. Es war nie für die Verwendung außerhalb eines Webkontexts vorgesehen, kann jedoch außerhalb des Webkontexts verwendet werden und führt alle oben genannten Ablaufverhalten in einer Art Hashtabelle aus.
Nach dem Durchsuchen von Google scheint es, dass einige Leute, die die in .NET integrierte Caching-Funktionalität erörtert haben, in ihren Nicht-Web-Projekten auf die Verwendung des ASP.NET-Cache zurückgegriffen haben. Dies ist nicht mehr das am besten verfügbare und am meisten unterstützte integrierte Caching-System in .NET. .NET 4 verfügt über einen ObjectCache, auf den ich später noch eingehen werde. Microsoft hat immer darauf bestanden, dass der ASP.NET-Cache nicht für die Verwendung außerhalb des Webs vorgesehen ist. Viele Menschen stecken jedoch immer noch in .NET 2.0 und .NET 3.5 fest und benötigen etwas, mit dem sie arbeiten können. Dies funktioniert bei vielen Menschen, obwohl MSDN klar sagt:
Die Klasse für den ASP.NET-Cache ist System.Web.Caching.Cache in System.Web.dll. Sie können ein Cache-Objekt jedoch nicht einfach neu erstellen. Sie müssen es von System.Web.HttpRuntime.Cache erwerben.
Die Arbeit mit dem ASP.NET-Cache ist hier auf MSDN dokumentiert .
Vorteile:
Nachteile:
ObjectCache / MemoryCache von .NET 4.0
Microsoft hat schließlich eine abstrakte ObjectCache-Klasse in der neuesten Version von .NET Framework und eine MemoryCache-Implementierung implementiert, die ObjectCache für speicherinterne Zwecke in einer Nicht-Web-Umgebung erbt und implementiert.
System.Runtime.Caching.ObjectCache befindet sich in der Assembly System.Runtime.Caching.dll. Es ist eine abstrakte Klasse, die im Grunde dieselben .NET 1.0-Schnittstellen deklariert, die im ASP.NET-Cache gefunden werden.
System.Runtime.Caching.MemoryCache
ist die speicherinterne Implementierung von ObjectCache und ähnelt mit einigen Änderungen dem ASP.NET-Cache.Um ein Element mit einem verschiebbaren Ablauf hinzuzufügen, sieht Ihr Code ungefähr so aus:
Vorteile:
Im Gegensatz zum ASP.NET-Cache können Sie eine MemoryCache-Objektinstanz instanziieren.
Im Vergleich zur Benutzeroberfläche des ASP.NET-Cache wurden einige geringfügige Verbesserungen vorgenommen, z. B. die Möglichkeit, Entfernungsereignisse zu abonnieren, ohne dass diese beim Hinzufügen der Elemente unbedingt vorhanden sein müssen. Das redundante Insert () wurde entfernt. Elemente können mit einem CacheItem hinzugefügt werden Objekt mit einem Initialisierer, der die Caching-Strategie definiert, und Contains () wurde hinzugefügt.
Nachteile:
DIY: Bauen Sie sich selbst
Es ist eigentlich ziemlich einfach, ein Caching-Wörterbuch zu erstellen, das einen expliziten oder gleitenden Ablauf ausführt. (Es wird viel schwieriger, wenn Elemente zum Löschen des Speichers automatisch entfernt werden sollen.) Hier ist alles, was Sie tun müssen:
Microsoft muss seine ursprünglichen Designs unterstützen, da seine Benutzerbasis eine Abhängigkeit von ihnen aufgebaut hat. Dies bedeutet jedoch nicht, dass es sich um gute Designs handelt.
Vorteile:
IDictionary<K,T>
. Dies erleichtert die Verwendung erheblich, da die Benutzeroberfläche als Wörterbuchschnittstelle vorhersehbarer ist und für Helfer und Erweiterungsmethoden, die mit IDictionary <> arbeiten, zugänglicher ist.Nachteile:
Unter allen vier dieser Optionen ist dies meine Präferenz. Ich habe diese grundlegende Caching-Lösung implementiert. Bisher scheint es perfekt zu funktionieren, es sind keine Fehler bekannt (bitte kontaktieren Sie mich mit Kommentaren unten oder bei jon-at-jondavis, falls vorhanden !!), und ich beabsichtige, es in all meinen kleineren Nebenprojekten zu verwenden, die benötigt werden Grundlegendes Caching. Hier ist es:
Github-Link: https://github.com/kroimon/ExpiringItemDictionary
Alter Link: ExpiringItemDictionary.zip
Erwähnenswert: AppFabric, NoSQL et al
Beachten Sie, dass der Titel dieses Blog-Artikels "Simple Caching" und nicht "Heavy-Duty Caching" angibt. Wenn Sie sich mit Schwerlast beschäftigen möchten, sollten Sie sich dedizierte, skalierbare Lösungen ansehen.
quelle
MemoryCache ist das, was es verspricht, ein im Speicher gespeicherter Cache
HttpRuntime.Cache (siehe http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v=vs.100).aspx und http://msdn.microsoft.com/en- us / library / system.web.caching.cache.aspx ) bleibt bei dem, was Sie in Ihrer Anwendung konfigurieren.
Siehe zum Beispiel "ASP.NET 4.0: Benutzerdefinierte Ausgabe-Cache-Anbieter schreiben" http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache -providers.aspx
quelle
MemoryCache.Default kann auch als "Brücke" dienen, wenn Sie eine klassische ASP.NET MVC-App auf ASP.NET Core migrieren, da in Core keine "System.Web.Caching" und "HttpRuntime" vorhanden sind.
Ich habe auch einen kleinen Benchmark geschrieben, um ein
bool
Element 20000 Mal zu speichern (und einen anderen Benchmark, um es abzurufen), und MemoryCache scheint zweimal langsamer zu sein (27 ms gegenüber 13 ms - das ist insgesamt für alle 20.000 Iterationen), aber beide sind superschnell und dies kann wahrscheinlich ignoriert werden.quelle