1. Übersicht In Webanwendungen kann die Erstellung einiger Berichte lange dauern, bis die Datenbank Wetterinformationen bereitstellt, was den Zugriff auf einen Remote-Server erfordert, um einen SOAP-Aufruf zum Abrufen von Temperaturinformationen durchzuführen. All dies sind Beispiele für komplexe Informationen. Das Hinzufügen zu vieler komplexer Informationen zu einer Webseite kann zu einer Überlastung des Webservers und des Datenbankservers führen. Die Pufferung von JSP-Codeblöcken gibt Entwicklern die Freiheit, alle Arten komplexer Informationen nach Belieben hinzuzufügen.
JSP kann komplexen Java-Code in der Tag-Bibliothek kapseln und ausführen, wodurch die Wartung von JSP-Seitendateien einfacher wird und die Verwendung von JSP-Seitendateien für nicht professionelle Entwickler bequemer wird. Es gibt bereits viele Tag-Bibliotheken, bei denen es sich entweder um kommerzielle Produkte oder Open-Source-Produkte handelt. Die meisten dieser Produkte verwenden jedoch nur Tag-Bibliotheken, um Funktionen zu implementieren, die mit einem einfachen Java-Scriptlet implementiert werden können. Nur wenige Produkte verwenden benutzerdefinierte Tags auf kreative Weise und bieten fast die gleiche Funktionalität wie vor dem Aufkommen benutzerdefinierter JSP-Tag-Bibliotheken.
Die von OpenSymphony entwickelte OSCache-Tag-Bibliothek ist eine bahnbrechende benutzerdefinierte JSP-Tag-Anwendung, die schnelles Speicher-Caching innerhalb vorhandener JSP-Seiten ermöglicht. Es gibt zwar einige Anbieter, die Caching-Produkte in verschiedenen Formen anbieten, es handelt sich jedoch bei allen um herstellerspezifische Produkte. OSCache kann auf jedem JSP 1.1-kompatiblen Server ausgeführt werden und vorhandene JSP-Codeblöcke nicht nur für alle Benutzer, sondern auch pro Benutzer zwischenspeichern. OSCache enthält außerdem einige erweiterte Funktionen zur Verbesserung der Skalierbarkeit, z. B. Pufferung auf Festplatte, programmierbare Pufferlöschung, Ausnahmekontrolle usw. Darüber hinaus wird der Code von OSCache wie andere OpenSymphony-Produkte unter einer Open-Source-Lizenz frei verbreitet.
In diesem Artikel wird ein imaginärer Designprozess einer Auktionswebsite als Beispiel verwendet, um den Arbeitsprozess von OSCache vorzustellen. Diese hypothetische Website würde Folgendes enthalten:
1: Eine Verwaltungsseite, die aktuelle Auktionsaktivitäten meldet;
2: Eine Homepage mit vollständigen Funktionen und diversen Werbeinformationen;
3: Eine spezielle Navigationsleiste, die alle noch nicht abgeschlossenen Auktionsinformationen des Benutzers enthält.
2. Verwaltungsseite
Die Auktionswebsite enthält einen Verwaltungsbericht und es dauert einige Sekunden, bis der Datenbankserver einen solchen Bericht erstellt. Es ist wichtig, dass die Erstellung des Berichts lange dauert, da möglicherweise mehrere Administratoren den Betrieb des Systems überwachen und wir vermeiden möchten, dass der Bericht bei jedem Besuch des Administrators neu erstellt wird. Um dies zu erreichen, kapseln wir die gesamte Seite in ein Puffer-Tag auf Anwendungsebene, das stündlich aktualisiert wird. Einige Produkte anderer Anbieter verfügen über ähnliche Funktionen, nur dass OSCache diese besser beherrscht als diese.
Der Einfachheit halber konzentrieren wir uns nicht zu sehr auf Formatierungsfragen. Beim Schreiben der Verwaltungsseite fügen wir zunächst die Tag-Bibliotheksdeklaration zur Seite hinzu:
<%@ taglib uri="cachetags" prefix="cache" %>
Als nächstes müssen wir die gesamte Seite mit Cache-Tags umgeben. Die Standard-Cache-Zeit für Cache-Tags beträgt 1 Stunde.
<cache:cache> .... Komplexe Verwaltungsberichte.... </cache:cache>
Die Verwaltungsseite wird jetzt zwischengespeichert. Wenn der Administrator innerhalb einer Stunde nach der Generierung der Seite erneut auf dieselbe Seite zugreift, sieht er die zuvor zwischengespeicherte Seite und es ist nicht erforderlich, dass der Datenbankserver diesen Bericht erneut generiert.
3. Startseite Auf der Startseite der Auktionswebsite werden Website-Aktivitäten angezeigt und Auktionen beworben, die kurz vor dem Ende stehen. Wir möchten die Anzahl der laufenden Auktionen, die Anzahl der aktuell angemeldeten Benutzer, eine Liste der Auktionen, die in naher Zukunft enden werden, und die aktuelle Uhrzeit anzeigen. Für diese Nachrichten gelten unterschiedliche Anforderungen an die Zeitgenauigkeit. Auktionen auf der Website dauern in der Regel mehrere Tage, daher können wir die Zeit zum Puffern der Anzahl gültiger Auktionen auf 6 Stunden einstellen. Die Anzahl der Benutzer wird sich natürlich häufiger ändern, hier werden wir diesen Wert jedoch für jeweils 15 Minuten zwischenspeichern. Schließlich möchten wir, dass die auf der Seite angezeigte aktuelle Uhrzeit immer genau die Zeit ist, zu der die Seite aufgerufen wurde.
Nachdem wir die Tag-Bibliothek auf der Startseite deklariert haben, geben wir zunächst das aktuelle Datum ohne Pufferung direkt aus:
Jetzt lautet es: <%=new java.util.Date()%>
Als nächstes wollen wir eine Liste der Auktionen anzeigen die kurzfristig enden:
<cache:cache> <ul> <% // Konstruiere einen Iterator mit aktuellen Auktionen. Iterator Auktionen = .... while (auctions.hasMore()) { Auction Auction = (Auction) Auctions.next (); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Schließlich möchten wir die Anzahl der laufenden Auktionen anzeigen, diese Zahlen müssen sein 6 Stunden gepuffert. Da die Cache-Markierung die Anzahl der Sekunden zum Puffern von Daten erfordert, konvertieren wir 6 Stunden in 21600 Sekunden:
<cache:cache time="21600"> <% //Fragen Sie die Datenbank ab, um die Gesamtzahl der Auktionsaktivitäten zu erhalten int AuctionCount = .. .. %> Auf dieser Website finden <%=auctionCount%> laufende Auktionen statt </cache>
Wie Sie sehen, verwenden wir nur wenig Code, um eine Homepage mit einem komplexen Puffersystem zu erstellen. Dieses Puffersystem puffert jeden Teil der Seite separat, und die Pufferzeit jedes Teils stimmt vollständig mit der Häufigkeit der Änderungen in den jeweiligen Informationen überein. Dank der Pufferung können wir jetzt mehr Inhalte auf der Homepage platzieren; ohne vorherige Pufferung führt die Platzierung von zu viel Inhalt auf der Homepage zu einer Verlangsamung des Seitenzugriffs und kann sogar zu Problemen für den Datenbankserver führen.
4. Navigationsleiste Angenommen, wir entscheiden uns bei der Planung der Website dafür, den Inhalt des Warenkorbs unterhalb der linken Navigationsleiste anzuzeigen. Wir zeigen dem Nutzer für jeden Artikel in der Auktion die Anzahl der Gebote und den aktuellen Preis sowie eine Liste aller Artikel an, für die der aktuelle Nutzer das höchste Gebot abgegeben hat.
Wir verwenden Pufferfunktionen auf Sitzungsebene, um die oben genannte Funktionalität in der Navigationsleiste zu erstellen. Fügen Sie den folgenden Code in die Vorlage oder Include-Datei ein, damit andere Seiten der Website auf diese Navigationsleiste verweisen können:
<cache:cache key="navbar" Scope="session" time="300"> <% //Extrahieren und anzeigen die aktuellen Gebotsinformationen%> </cache:cache>
Hier stellen wir zwei wichtige Attribute vor, nämlich Schlüssel und Umfang. Da im Code weiter oben in diesem Artikel das Cache-Tag automatisch einen eindeutigen Schlüssel für den Codeblock erstellen kann, müssen wir dieses Schlüsselattribut nicht manuell festlegen. Aber hier möchten wir auf diesen zwischengespeicherten Codeblock vom Rest der Site verweisen, also definieren wir explizit das Schlüsselattribut des Cache-Tags. Zweitens wird das Bereichsattribut verwendet, um dem Cache mitzuteilen, dass er markieren soll, dass der aktuelle Codeblock pro Benutzer gepuffert werden muss, anstatt einmal für alle Benutzer zu puffern.
Sie sollten bei der Verwendung der Pufferung auf Sitzungsebene sehr vorsichtig sein und es sollte klar sein: Obwohl wir eine komplexe Navigationsleiste erstellen können, um die Serverlast um das Fünffache oder Zehnfache zu reduzieren, erhöht sich dadurch der pro Sitzung erforderliche Speicherplatz erheblich. Es ist zweifellos ideal, die Anzahl möglicher gleichzeitiger Benutzer im Hinblick auf die CPU-Fähigkeiten zu erhöhen, aber sobald die Anzahl gleichzeitiger Benutzer auf die Grenze der CPU im Hinblick auf die Speicherunterstützungsfähigkeiten reduziert wird, ist diese Lösung nicht mehr ideal.
Wie bereits in diesem Artikel erwähnt, möchten wir auf diesen gepufferten Codeblock vom Rest der Site verweisen. Dies liegt daran, dass wir den Puffer aktualisieren möchten, wenn ein Benutzer einen Artikel zur Auktion hinzufügt oder für von anderen Benutzern versteigerte Artikel bietet, damit die Navigationsleiste beim nächsten Lesen über den neuesten Inhalt verfügt. Während sich diese Daten aufgrund der Aktivität anderer Benutzer ändern können, kann es für einen Benutzer sehr verwirrend sein, zu sehen, dass sein Eintrag unverändert bleibt, nachdem er eine Aktion auf der Website ausgeführt hat.
Das von der OSCache-Bibliothek bereitgestellte Flush-Tag kann den Pufferinhalt aktualisieren. Wir können der Seite den folgenden Code hinzufügen, der Benutzeraktionen verarbeitet, die sich auf diesen Bereich auswirken können:
<cache:flush key="navbar" Scope="session" />
Wenn der Benutzer das nächste Mal darauf zugreift, wird der Navbar-Pufferblock aktualisiert .
Bisher ist der Aufbau unserer Beispiel-Website abgeschlossen und kann mit dem Betrieb beginnen. Werfen wir einen Blick auf die Ausnahmebehandlungsfunktionen von OSCache. Auch wenn der gepufferte Inhalt ungültig gemacht wurde, beispielsweise aufgrund einer Java-Ausnahme im Pufferblock, ermöglicht uns die OSCache-Tag-Bibliothek weiterhin, den Inhalt programmgesteuert anzuzeigen. Mit dieser Ausnahmekontrollfunktion können wir die Verbindung zwischen dem Datenbankserver und dem Webserver trennen und die Website kann weiterhin ausgeführt werden. Mit der JSP 1.2-Spezifikation wurde die TryCatchFinally-Schnittstelle eingeführt, die es dem Tag selbst ermöglicht, Java-Ausnahmen zu erkennen und zu behandeln. Daher kann Markup mit diesem Ausnahmebehandlungscode kombiniert werden, um JSP-Seiten einfacher und besser organisiert zu gestalten.
OpenSymphony plant die Implementierung zusätzlicher Pufferungsmechanismen sowie eines besser verwaltbaren Hauptsystems, das es uns ermöglicht, den durch die Pufferung verwendeten RAM- und Festplattenspeicher zu verwalten. Sobald diese Funktionen vorhanden sind, können wir die Reaktionsfähigkeit und Zuverlässigkeit der Website weiter verbessern.
Verwendungsbeispiel:
oscache.properties-Dateikonfigurationsassistent „
cache.memory“.
Der Wert ist wahr oder falsch. Der Standardwert ist die Zwischenspeicherung im Speicher.
Wenn es auf „false“ gesetzt ist, kann der Cache nur in der Datenbank oder auf der Festplatte zwischengespeichert werden. Was ist also der Sinn des Caches? :)
Cache.Capacity
Anzahl der Cache-Elemente
zwischencache.persistence.class
Persistente Cache-Klasse. Wenn diese Klasse aktiviert ist, müssen Sie die Cache.Pfad-Informationen
zwischen Cache.Cluster und Cluster-Einstellungsinformationen festlegen.
wie
Cache.cluster.multicast.ip ist die Broadcast-IP-Adresse
Cache.cluster.properties sind die Clustereigenschaften
3. Die grundlegende Verwendung von OSCache
Cache1.jsp ist wie folgt:
<%@ page import="java.util.*" %>
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
Kein zwischengespeichertes Datum: <%= new Date() %><p>
<!--Automatische Aktualisierung-->
<cache:cache time="30">
Aktualisieren Sie das zwischengespeicherte Datum alle 30 Sekunden: <%= new Date() %>
</cache:cache>
<!--Manuelle Aktualisierung-->
<cache:cache key="testcache">
Aktualisieren Sie das zwischengespeicherte Datum manuell: <%= new Date() %> <p>
</cache:cache>
<a href="/cache2.jsp">Manuelle Aktualisierung</a>
</body>
</html>
Cache2.jsp führt die manuelle Aktualisierung der Seite wie folgt durch
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
Der Cache wurde geleert...<p>
<cache:flush key="testcache" Scope="application"/>
<a href="/cache1.jsp">Return</a>
</body>
</html>
Sie können den effektiven Bereich des Cache auch über die folgende Anweisung definieren. Wenn Sie keinen Bereich definieren, wird der Bereich standardmäßig auf „Anwendung“ festgelegt.
<cache:cache time="30" Scope="session">
...
</cache:cache>
4. Cache-Filter CacheFilter
Sie können in web.xml einen Cache-Filter definieren, um den Cache bestimmter Ressourcen zu definieren.
1 <Filter>
2 < Filtername > CacheFilter </ Filtername >
3 < filter - Klasse > com.opensymphony.oscache.web.filter.CacheFilter </ filter - Klasse >
4 <init-param>
5 <param-name>Zeit</param-name>
6 < param - value > 60 </ param - value >
7 </init-param>
8 <init-param>
9 <param-name>Bereich</param-name>
10 <param-value>Sitzung</param-value>
11 </init-param>
12 </ Filter >
13
14
15 <Filterzuordnung>
16 < Filtername > CacheFilter </ Filtername >
17 < url - Muster >* .jsp </ url - Muster >
18 </ filter - Zuordnung >
Die obige Definition speichert alle .jsp-Seiten zwischen, die Cache-Aktualisierungszeit beträgt 60 Sekunden und der Cache-Bereich ist Sitzung.
Beachten Sie, dass CacheFilter nur Seitenanforderungen mit einem HTTP-Header von 200 erfasst, dh nur fehlerfreie Anforderungen zwischenspeichert.
Anstatt andere Anfragen (z. B. 500, 404, 400) zwischenzuspeichern
, kann uns OSCache dabei helfen, eine farbenfrohere und leistungsfähigere Website zu erstellen. Mit Hilfe der OSCache-Tag-Bibliothek können wir nun damit einige Probleme lösen, die sich auf die Reaktionsfähigkeit der Website auswirken, wie z. B. Spitzenverkehrszeiten, überlastete Datenbankserver usw.
Persönlicher Tipp: Wenn Sie Struts oder eine andere MVC-Architektur verwenden, ist es schwierig, die durch das Oscache-Tag erzielte Leistungsverbesserung zu nutzen, da jede Anfrage noch zur Verarbeitung an Action--Dao oder eine andere Sache gesendet werden muss. Verwenden Sie daher Caching Sie benötigen andere Methoden, z. B. das Caching auf Methodenebene im Spring's Interceptor ... Wenn alle Ihre Geschäftsverarbeitungscodes in JSP-Seiten geschrieben sind, können Sie Cache-Tags verwenden, um die zuvor generierten Seitendaten zwischenzuspeichern und so die Ausführung derselben Geschäftsvorgänge zu vermeiden.