Ein persistenter Dateisystem -Festplatten -Cache für ASP.NET

Zusammenfassung von: https://www.codeprroject.com/articles/12097/cache-management-in-asp-net
Verwenden Sie verschiedene Begriffe, um dasselbe Konzept zu erklären, dh Daten zu verwalten. Einige Leute bezeichnen es als Staatsmanagement und andere als Cache -Management. Ich mag das Wort "Cache". Konzeptionell gibt es jedoch keinen Unterschied zwischen diesen beiden.
Lassen Sie uns nun verschiedene Aspekte des Cache -Managements (oder des staatlichen Managements) in ASP.NET erörtern.
Obwohl das Cache -Management in Windows -Anwendungen kein Problem ist, war es in der Webumgebung immer eine Herausforderung. Da es sich bei HTTP um ein staatenloses Protokoll handelt und ein Webserver Benutzer zwischen verschiedenen Anforderungen nicht erkennt, ist es für uns sehr wichtig, einen bestimmten Benutzer zwischen verschiedenen Anforderungen und auch Daten zu speichern, damit er zwischen verschiedenen Anforderungen wiederverwendet werden kann. ASP.NET bietet viele Funktionen für das Speichern von Daten sowohl im Client (Browser) als auch auf den Seiten des Servers (Webserver). Manchmal werden wir jedoch verwechselt, wann sie verwendet werden sollen. In ASP.NET stoßen wir auf Funktionen wie Sitzungs-, Anwendungs- und Cache -Objekte, aber es ist wichtig, dass wir den Unterschied zwischen ihnen verstehen, um sie in Webanwendungen effektiv zu verwenden.
In diesem Artikel werde ich die verschiedenen in ASP.NET verfügbaren Cache -Managementoptionen berühren. In einer Webanwendung müssen wir manchmal Daten auf der Serverseite speichern, um einen kostspieligen Datenabruf von Datenspeichern aus Datenspeichern und zeitaufwändige Datenformatierungslogik zu vermeiden, um die Anwendungsleistung zu verbessern und dieselben Daten in nachfolgenden Anfragen zwischen Benutzern, Anwendungen und Maschinen wiederzuverwenden. Um dies zu erreichen, müssen wir Daten (Cache) auf der Serverseite speichern.
Das Caching hilft uns, drei wichtige Aspekte von QoS (Servicequalität) zu erreichen:
ASP.NET bietet ein Objekt namens Anwendungsobjekt, um Daten zu speichern, auf die alle Benutzeranforderungen zugegriffen werden können. Die Lebensdauer dieses Objekts ist an die Anwendung gebunden und jedes Mal, wenn die Anwendung beginnt, neu erstellt. Im Gegensatz zu ASP.NET -Session -Objekt ist dieses Objekt für alle Benutzeranforderungen zugegriffen. Da dieser Speicher in einem Anwendungsdomänenraum erstellt und verwaltet wird, sollte dies nicht für die Datenspeicherung in einem Webfarm -Szenario verwendet werden. Diese Option ist sehr nützlich, um Daten wie die Anwendungsmetadaten (Konfigurationsdateien) zu speichern, die während der Anwendungsstart an das Anwendungsobjekt geladen werden können und während der Lebensdauer der Anwendung verwendet werden können, ohne sie für jede Benutzeranforderung jedes Mal neu zu laden. Wenn es jedoch erforderlich ist, die zwischengespeicherten Daten zu ungültig zu machen, wenn sich die Konfigurationsdateien während des Ausführens der Anwendung ändern, sollte diese Option nicht verwendet werden, da sie keine Funktion zur Ablauf der zwischengespeicherten Daten bereitstellt. In diesem Fall sollten also andere Optionen wie das ASP.NET -Cache -Objekt verwendet werden, was unten erläutert wird.
ASP.NET stellt ein Schlüsselwert -Paarobjekt bereit - das Cache -Objekt, das im System verfügbar ist. Der Anwendungsbereich ist die Anwendungsdomäne und die Lebensdauer ist an die Anwendung gebunden. Im Gegensatz zum ASP.NET -Sitzungsobjekt ist dieses Objekt für alle Benutzeranforderungen zugegriffen.
Obwohl sowohl Anwendungs- als auch Cache -Objekte gleich aussehen, sind die wichtigsten Unterschiede zwischen ihnen die zusätzlichen Funktionen, die vom Cache -Objekt wie den Ablaufrichtlinien und Abhängigkeiten bereitgestellt werden. Dies bedeutet, dass die im Cache -Objekt gespeicherten Daten basierend auf einem vordefinierten Zeitlimit, der vom Anwendungscode festgelegt wurde, oder wenn die abhängige Entität geändert wird, während diese Funktion im Anwendungsobjekt nicht verfügbar ist.
Lassen Sie uns die unterschiedlichen Ablaufrichtlinien und die unterstützten Abhängigkeiten diskutieren.
Abhängigkeit bedeutet, dass ein Element aus dem Cache entfernt werden kann, wenn eine abhängige Entität geändert wird. Daher kann eine abhängige Beziehung auf einem Element definiert werden, dessen Entfernung aus dem Cache vom Abhängigen abhängt. Es gibt zwei Arten von Abhängigkeiten, die in ASP.NET unterstützt werden.
Beispiel: Sagen wir in meiner Anwendung, ich verwende eine XML -Datei, um Fehlerdetails (Fehlernummer und Fehlermeldung zuzuordnen) zu speichern, mit der eine Fehlermeldung für eine bestimmte Fehlernummer zur Laufzeit abgerufen wird. Anstatt jedes Mal, wenn ich eine Fehlermeldung benötige, die Datei von der Festplatte zu lesen, beschließen wir, sie einmal beim Anwendungsstart zu laden und im ASP.NET -Cache zu speichern, um weitere Verwendung zu erhalten. Wenn ich also die Konfigurationsdatei ändern muss, um neue Fehlermeldungen hinzuzufügen, oder einige der vorhandenen Fehlermeldungen während der Ausführung der Anwendung ändern, was passiert dann mit meinen zwischengespeicherten Daten? Muss ich die Anwendung stoppen und erneut starten, um die Dateiänderungen in der Anwendung widerzuspiegeln? Die Antwort ist nein. Die Cache -Daten können immer dann ungültig gemacht werden, wenn sich die Datei mithilfe der Option Dateiabhängigkeit ändert.
Die Ablaufrichtlinie legt die Richtlinie fest, wie und wann ein Artikel im Cache ausfallen sollte.
Das .NET -Remoting Singleton -Objekt teilt dieselbe Instanz mit mehreren Clients, sodass Singleton -Objekte zum Speichern und Freigeben von Daten zwischen verschiedenen Client -Aufrufe verwendet werden können. Da .NET -Remoting außerhalb des Prozesses und des Geräts verwendet werden kann, ist diese Option sehr nützlich, wenn wir Daten zwischendurchschnittlich sind und sie über Server und Benutzer weitergeben möchten, insbesondere in einem Webfarm -Szenario. In diesem Ansatz können wir die Daten als Mitgliedsvariablen des Singleton -Remoting -Objekts speichern und Methoden zum Lesen und Speichern von Daten bereitstellen. Während der Implementierung müssen wir jedoch sicherstellen, dass das als Cache verwendete Remoting -Objekt vom Müllsammler nicht zerstört wird. Dafür müssen wir den Mietzeitraum des Remoting -Cache -Objekts auf unendlich einstellen, so dass die Mietzeit nie ausfällt. Wir können dies tun, indem wir die InitializeLifetimeservice -Methode von MarshalbyrefObject überschreiben und Null aus dieser Methode zurückgeben. Das einzige Problem mit diesem Ansatz ist jedoch die Leistung. Wie die Analyse sagt, ist die Leistung bei diesem Ansatz im Vergleich zu anderen Ansätzen sehr schlecht. Wie auch immer, es liegt an den Anwendungsdesignern/Entwicklern, verschiedene Optionen zu analysieren und das Beste zu verwenden, was zu der Anforderung entspricht.
Sie alle wissen, was für eine von Speicher-abgebildete Datei ist. Es geht im Grunde genommen darum, eine Datei auf der Festplatte auf einen bestimmten Bereich von Adressen im Prozessadressraum der Anwendung zuzuordnen. Mit dieser Option können verschiedene Prozesse dieselben Daten verwenden, indem die Anwendungsleistung erhöht wird. Da die Verwendung von Speicher-Made-Datei bei .NET-Entwicklern nicht sehr beliebt ist, würde ich diesen Ansatz persönlich nicht vorschlagen, da dies eine Menge Komplexitäten beinhaltet, und auch .NET Framework unterstützt dies nicht. Wenn jedoch jemand sehr daran interessiert ist, diesen Ansatz zu verwenden, müssen er seine eigene kundenspezifische Lösung nach seiner eigenen Anforderung entwickeln.
Wir verwenden statische Variablen, um Daten oder Objekte weltweit zu speichern, damit sie während der Lebensdauer der Anwendung zugreifen können. In ähnlicher Weise können wir in ASP.NET statische Objekte zum Zwischenspeichern von Daten verwenden und können auch Methoden zum Abrufen und Speichern von Daten auf dem Cache bereitstellen. Da statische Variablen im Prozessbereich gespeichert werden, ist die Leistung in Bezug auf schneller. Da es jedoch sehr schwierig ist, Verfallsrichtlinien und Abhängigkeiten bei statischen Variablen zu implementieren, bevorzuge ich im Allgemeinen ASP.NET -Cache -Objekt gegenüber dieser Option. Ein weiteres Problem ist, dass das benutzerdefinierte statische Cache-Objekt threadsicher sein muss, das sorgfältig implementiert werden muss.
Wir können auch eine Datenbank zum Speichern von Daten und zum Austausch der Daten über Benutzer und Maschinen verwenden. Dieser Ansatz ist sehr nützlich, wenn wir große Datenmengen zwischenspeichern möchten. Die Verwendung dieses Ansatzes zum Speichern einer geringen Datenmenge ist aufgrund der Leistung keine gute Idee. Um eine kleine Datenmenge zu speichern, sollten wir uns für andere ASP.NET-In-Prozess-Caching-Mechanismen entscheiden. Da die Daten in einer Datenbank gespeichert werden müssen, müssen alle Objekte XML serialisiert werden, damit es einfacher ist, zu speichern und abzurufen. Wir können auch andere Arten von Serialisierungsformaten verwenden, die im .NET -Framework verfügbar sind.
Manchmal ändert sich die Ausgabe in unserer Anwendung auf einigen Seiten im Allgemeinen nicht für einen bestimmten Zeitraum. In einer Personal -Website ändert sich beispielsweise die Gehaltsdetails eines Mitarbeiter nicht sehr häufig und ändert sich nur einmal im Monat. Im Allgemeinen ändert sich es nur am 1. Tag eines jeden Monats. Während eines Monats werden die Gehaltsdetails Seite für einen bestimmten Mitarbeiter dieselben Details angezeigt. Ist es also in diesem Fall nicht eine gute Idee, die Seite irgendwo auf dem Server zwischenzuspeichern, um jedes Mal, wenn der Mitarbeiter seine Gehaltsdetails sehen möchte, auf die Verarbeitung von Geschäftsberechnungen, die Aufrufe der Datenbank und die Seitenrending -Logik zu vermeiden. Meiner Meinung nach ja! Es ist eine sehr gute Idee. Um dies zu erreichen, bietet ASP.NET eine Funktion zum Speichern der Ausgabe einer Seite auf dem Server für einen bestimmten Zeitraum. Es bietet auch Funktionen, um ein Fragment einer Seite zu speichern, das als Seitenfragment -Caching bekannt ist.
Manchmal müssen wir möglicherweise Daten oder Seiten auf der Client -Seite zwischenspeichern, um die Anwendungsleistung zu verbessern. Die Verwendung dieses Mechanismus reduziert die Last auf dem Server, aber dieser Mechanismus hat einige Sicherheitsprobleme, da wir die Daten auf der Client -Seite zwischenspeichern.
Cookie ist ein clientseitiger Speicher, der für jede Anforderung an den Server gesendet und auch als Antwort vom Server empfangen wird. Aufgrund seiner Größenbeschränkung sollte es zum Speichern einer geringen Datenmenge verwendet werden. Für Cookies können Ablaufrichtlinien festgelegt werden, um die Elemente nach einem bestimmten Zeitraum ungültig zu machen.
ASP.NET ViewState ist nur ein Konzept in Webformen (nicht in MVC), bei dem die Daten auf die Seiten und Steuerelemente auf der generierten Seite (Client -Seite) gespeichert sind. Dies behält die Werte über mehrere Anforderungen an den Server hinweg. ViewState wird in ASP.NET intern als verschließende versteckte Felder implementiert. ViewState sollte nicht verwendet werden, um große Datenmengen zu speichern, da diese für jede Anforderung an den Server übergeben werden.
Das versteckte Feld ähnelt jeder anderen Kontrolle auf einer Seite, aber der sichtbare Zustand dieser Kontrolle ist immer falsch. Wie ViewState sollten wir es nicht zum Speichern großer Datenmengen verwenden. Versteckte Frames können verwendet werden, um Daten auf der Client -Seite zu speichern. Beachten Sie jedoch, dass versteckte Frames nicht von allen Internetbrowsern unterstützt werden.
Internet -Browser bietet Caching -Mechanismus für die Seiten von Seiten auf der Client -Seite. Dies kann mithilfe der Ablaufanweisung festgelegt werden, die dem Header der Seiten hinzugefügt wurde, oder indem Sie sie manuell auf dem Webserver einstellen. Wir sollten diese Option verwenden, um statische Seiten, Skripte, CSS und Bilder auf der Client -Seite zu zwischenstrahlen.
Hergestellt mit ❤️ von Javier Cañon.