Ich habe viele Informationen zum Seiten-Caching und zum teilweisen Seiten-Caching in einer MVC-Anwendung gelesen. Ich würde jedoch gerne wissen, wie Sie Daten zwischenspeichern würden.
In meinem Szenario verwende ich LINQ to Entities (Entity Framework). Beim ersten Aufruf von GetNames (oder was auch immer die Methode ist) möchte ich die Daten aus der Datenbank abrufen. Ich möchte die Ergebnisse im Cache speichern und beim zweiten Aufruf die zwischengespeicherte Version verwenden, falls vorhanden.
Kann jemand ein Beispiel zeigen, wie dies funktionieren würde, wo dies implementiert werden sollte (Modell?) Und ob es funktionieren würde.
Ich habe dies in herkömmlichen ASP.NET-Apps gesehen, normalerweise für sehr statische Daten.
asp.net-mvc
database
caching
Coolcoder
quelle
quelle
Antworten:
Verweisen Sie auf die System.Web-DLL in Ihrem Modell und verwenden Sie System.Web.Caching.Cache
Ein bisschen vereinfacht, aber ich denke, das würde funktionieren. Dies ist nicht MVC-spezifisch und ich habe diese Methode immer zum Zwischenspeichern von Daten verwendet.
quelle
DB.GetNames().AsQueryable
Methode zum Verzögern der Abfrage?Hier ist eine nette und einfache Cache-Helfer-Klasse / Dienst, die ich benutze:
Verwendung:
Der Cache-Anbieter prüft, ob sich im Cache etwas mit dem Namen "Cache-ID" befindet. Wenn dies nicht der Fall ist, ruft er eine Delegate-Methode auf, um Daten abzurufen und im Cache zu speichern.
Beispiel:
quelle
Ich beziehe mich auf den Beitrag von TT und schlage den folgenden Ansatz vor:
Verweisen Sie auf die System.Web-DLL in Ihrem Modell und verwenden Sie System.Web.Caching.Cache
Sie sollten keinen Wert zurückgeben, der erneut aus dem Cache gelesen wurde, da Sie nie wissen, ob er sich zu diesem bestimmten Zeitpunkt noch im Cache befindet. Selbst wenn Sie es zuvor in die Anweisung eingefügt haben, ist es möglicherweise bereits verschwunden oder wurde noch nie zum Cache hinzugefügt - Sie wissen es einfach nicht.
Sie fügen also die aus der Datenbank gelesenen Daten hinzu und geben sie direkt zurück, ohne sie erneut aus dem Cache zu lesen.
quelle
Cache["names"] = noms;
nicht in den Cache gestellt?Für .NET 4.5+ Framework
Referenz hinzufügen:
System.Runtime.Caching
add using Anweisung:
using System.Runtime.Caching;
Mehr Info:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
quelle
Db.GerNames()
das?Steve Smith hat zwei großartige Blog-Beiträge verfasst, in denen gezeigt wird, wie sein CachedRepository-Muster in ASP.NET MVC verwendet wird. Es verwendet das Repository-Muster effektiv und ermöglicht Ihnen das Zwischenspeichern, ohne dass Sie Ihren vorhandenen Code ändern müssen.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
In diesen beiden Beiträgen zeigt er Ihnen, wie Sie dieses Muster einrichten und warum es nützlich ist. Wenn Sie dieses Muster verwenden, erhalten Sie Caching, ohne dass Ihr vorhandener Code die Caching-Logik sieht. Im Wesentlichen verwenden Sie das zwischengespeicherte Repository so, als wäre es ein anderes Repository.
quelle
AppFabric Caching ist verteilt und eine In-Memory-Caching-Technik, die Daten in Schlüssel-Wert-Paaren unter Verwendung des physischen Speichers auf mehreren Servern speichert. AppFabric bietet Leistungs- und Skalierbarkeitsverbesserungen für .NET Framework-Anwendungen. Konzepte und Architektur
quelle
Erweiterung der Antwort von @Hrvoje Hudo ...
Code:
Beispiele
Zwischenspeichern einzelner Elemente (wenn jedes Element anhand seiner ID zwischengespeichert wird, da das Zwischenspeichern des gesamten Katalogs für den Elementtyp zu intensiv wäre).
Alles zwischenspeichern
Warum TId
Der zweite Helfer ist besonders nett, da die meisten Datenschlüssel nicht zusammengesetzt sind. Zusätzliche Methoden können hinzugefügt werden, wenn Sie häufig zusammengesetzte Schlüssel verwenden. Auf diese Weise vermeiden Sie alle Arten von Zeichenfolgenverkettungen oder Zeichenfolgen. Formate, mit denen der Schlüssel an den Cache-Helfer übergeben wird. Dies erleichtert auch das Übergeben der Datenzugriffsmethode, da Sie die ID nicht an die Wrapper-Methode übergeben müssen. Das Ganze wird für die meisten Anwendungsfälle sehr knapp und konsistent.
quelle
Hier ist eine Verbesserung der Antwort von Hrvoje Hudo. Diese Implementierung weist einige wichtige Verbesserungen auf:
Beachten Sie, dass dies eine Abhängigkeit von Newtonsoft.Json zum Serialisieren des DependantsOn-Objekts hat, das jedoch problemlos gegen eine andere Serialisierungsmethode ausgetauscht werden kann.
ICache.cs
InMemoryCache.cs
Verwendung:
quelle
if (item == null)
sollte sich im Schloss befinden. Wenn dies jetztif
vor der Sperre ist, kann eine Rennbedingung auftreten. Oder noch besser, Sie solltenif
vor der Sperre bleiben , aber erneut prüfen, ob der Cache als erste Zeile innerhalb der Sperre noch leer ist. Denn wenn zwei Threads gleichzeitig kommen, aktualisieren beide den Cache. Ihre aktuelle Sperre ist nicht hilfreich.quelle
Ich habe es auf diese Weise benutzt und es funktioniert für mich. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx Parameterinformationen für system.web.caching.cache.add.
quelle
Ich benutze zwei Klassen. Zuerst das Cache-Kernobjekt:
Das zweite ist die Liste der Cache-Objekte:
quelle
Ich werde sagen, dass die Implementierung von Singleton bei diesem Problem mit anhaltenden Daten eine Lösung für diese Angelegenheit sein kann, falls Sie frühere Lösungen als sehr kompliziert empfinden
quelle
quelle
Sie können auch versuchen, das in ASP MVC integrierte Caching zu verwenden:
Fügen Sie der Controller-Methode, die Sie zwischenspeichern möchten, das folgende Attribut hinzu:
In diesem Fall wird das ActionResult 10 Sekunden lang zwischengespeichert.
Mehr dazu hier
quelle