Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Einstieg in ASP.NET von Matthias Lohrer
Einstieg in ASP.NET
gp Kapitel 15 Leistungssteigerung durch Caching
  gp 15.1 Ganze Seiten cachen
    gp 15.1.1 Formulare cachen
  gp 15.2 Teile von Seiten cachen
    gp 15.2.1 Benutzersteuerelemente cachen, die Formulare enthalten
  gp 15.3 Cache-Einstellungen mit der Klasse HttpCachePolicy programmgesteuert beeinflussen
  gp 15.4 Beliebige Daten und Objekte im Cache ablegen
  gp 15.5 Den Cache automatisch aktualisieren
    gp 15.5.1 Den Cache vom Inhalt einer XML-Datei abhängig machen
    gp 15.5.2 Weitere Möglichkeiten, den Cache abhängig zu machen
    gp 15.5.3 Den Cache über Prioritäten steuern
    gp 15.5.4 Reagieren, wenn ein Eintrag aus dem Cache gelöscht wird
  gp 15.6 Allgemeine Tipps zur Steigerung der Performance
  gp 15.7 Weiterführende Ressourcen

Kapitel 15 Leistungssteigerung durch Caching

Zeit ist Geld. Und Websurfer sind mit ihrer Zeit besonders knauserig. Mit Hilfe von gezieltem Caching steigern Sie die Leistung Ihrer Webanwendung. Damit steigern Sie gleichzeitig die Zufriedenheit der Besucher Ihrer Website.

Niemand wartet gern. Auch Websurfer warten nicht gern darauf, dass die gewünschte Seite sich im Browser aufbaut. Wenn eine Website zu träge reagiert, wird sie für die Besucher unattraktiv, und die Surfer bleiben aus. Im Zeitalter des E-Commerce können lange Ladezeiten sogar einen ökonomischen Schaden verursachen, wenn Surfer beispielsweise einen Online-Shop nur deswegen meiden, weil der Seitenaufbau zu lange dauert.

Es gibt verschiedene Methoden, um die Performance einer Website zu erhöhen. Eine Methode, die mit den Mitteln von Software beeinflusst werden kann, ist das Caching. Beim Caching werden Daten so zwischengespeichert, dass sie schnell verfügbar sind. Daten sind für einen Webserver unter zwei Voraussetzungen besonders schnell verfügbar:

gp  Die Daten liegen nicht auf der Festplatte, sondern bereits im Arbeitsspeicher.
gp  Die Daten sind abruffertig, das heißt, sie müssen nicht erst berechnet werden.

Wenn dann die Anforderung kommt, die Seite angebot.aspx zu senden, muss der Webserver die gecachte Seite nicht erst umständlich auf der Festplatte suchen, die enthaltenen Skripte ausführen und das Ergebnis schließlich zur Verfügung stellen. Nein, ein gezielter Griff ins RAM-Regal reicht und der Besucher erhält das Gewünschte schneller, als er erwartet hat.

ASP.NET bietet eine ausgefeilte Caching-Technologie. Eine spezielle Form des Cachings ist bereits ohne Zutun des Entwicklers bei jedem Seitenaufruf präsent. Im Gegensatz zum herkömmlichen ASP werden die Seiten nicht bei jedem Aufruf erneut interpretiert. Statt dessen kompiliert der Just-in-Time-Compiler des .NET Frameworks jede aspx-Seite beim ersten Aufruf. Wenn diese kompilierte Version erst einmal verfügbar ist, führt ASP.NET künftig stets die kompilierte Seite aus. Änderungen an der ursprünglichen Quelldatei erkennt ASP.NET automatisch. In diesem Fall erfolgt automatisch eine erneute Kompilierung.

Diese Just-in-Time-Kompilierung nutzt die zweite der eben vorgestellten Caching-Methoden: Die Daten müssen nicht erst neu berechnet werden, sondern liegen bereits in der ausgabefertigen Form vor. Allerdings müssen auch die kompilierten Seiten noch von der Festplatte geladen werden. Sie werden nicht automatisch auch im Arbeitsspeicher gehalten.

Über diese hilfreiche Arbeit des Just-in-Time-Compilers hinaus bietet ASP.NET weitere Möglichkeiten, mit Hilfe von gezieltem Caching die Leistung eines Systems zu verbessern. Dem Entwickler stehen prinzipiell drei Methoden zur Verfügung, Daten im Arbeitsspeicher zu halten. Er kann

gp  eine ganze Seite,
gp  Teile von Seiten oder
gp  Objekte beliebigen Typs

cachen, das heißt im Arbeitsspeicher zwischenspeichern. Alle drei Möglichkeiten werden im Folgenden vorgestellt.


Galileo Computing

15.1 Ganze Seiten cachen  downtop

Eine Seite, die nicht gecacht wird, muss ASP.NET bei jedem Aufruf neu rendern. Die Seite cache_01.aspx ist ein Beispiel für eine Seite, die nicht gecacht wird. Wenn Sie die Seite im Browser laden und mehrmals einen Reload ausführen, wird die Zeitangabe stets sekundengenau angezeigt. Daran können Sie erkennen, dass ASP.NET die Seite komplett neu aufgebaut hat.

<!-- cache_01.aspx --> 
<%@ Page Language="VB" Debug="True" Strict="True" %>
<html>
<head><title>Eine aspx-Seite cachen</title></head>
<body>
<h3>Eine aspx-Seite cachen</h3>
<p>Es ist jetzt <% = now.ToLongTimeString() %> Uhr.</p>
</body></html>

Mit Hilfe der OutputCache-Direktive können Sie die Seite cachen. Wenn Sie die Seite cache_02.aspx aufrufen und mehrmals einen Reload ausführen, wird die Zeit nicht mehr sekundengenau angezeigt. Die erste Zeitangabe bleibt über die folgenden zehn Sekunden gleich. Daran erkennen Sie, dass ASP.NET diese Seite nicht neu aufgebaut, sondern aus dem Cache geladen hat. Erst nach Ablauf von zehn Sekunden wird die Zeitangabe aktualisiert.

<!-- cache_02.aspx --> 
<%@ Page Language="VB" Debug="True" Strict="True" %>
<%@ OutputCache Duration="10" Location="Any" 
                VaryByParam="None" %>
<html>
<head><title>Eine aspx-Seite cachen</title></head>
<body>
<h3>Eine aspx-Seite cachen</h3>
<p>Es ist jetzt <% = now.ToLongTimeString() %> Uhr.</p>
</body></html>

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.1 Bei einem Reload können Sie an der Uhrzeit erkennen, ob die Seite gecacht wurde oder nicht.

Das Duration-Attribut der OutputCache-Direktive gibt die Zeit in Sekunden an, für die die Seite gecacht werden soll. Mit Duration="10" legt cache_02.aspx fest, dass die Seite für zehn Sekunden im Cache bleiben soll. Während dieser Zeit wird die Seite aus dem Cache geladen. Nach Ablauf dieser Zeit wird die Seite bei einem weiteren Aufruf neu gerendert.

Mit dem Location-Attribut geben Sie an, wo die Seite gecacht werden soll. Prinzipiell kann die Seite auf dem Server, auf einem Proxyserver oder auf dem Browser des Anwenders gecacht werden. Wenn alle drei Varianten gleichzeitig in Frage kommen, dann kann der Wert Location="Any" verwendet werden. Das ist zugleich auch die Voreinstellung.

Tabelle 15.1 verzeichnet die Attribute der OutputCache-Direktive.


Achtung   Die Seite wird nicht automatisch alle zehn Sekunden neu gerendert und in den Cache geladen. Wenn die Cache-Zeit abgelaufen ist, wird die Seite aus dem Cache gelöscht. Sie wird erst bei einem weiteren Aufruf neu gerendert und auch erst dann erneut in den Cache gestellt. Dort bleibt sie für den festgelegten Zeitraum und verfällt danach wieder.


Galileo Computing

15.1.1 Formulare cachen  toptop

Mit Hilfe der OutputCache-Direktive können Sie auch die Ausgabe von Formularen cachen, also von solchen Seiten, deren Inhalte von Parametern abhängig sind. cache_03.aspx enthält ein Beispiel. Abbildung 15.2 zeigt die Darstellung im Browser. Die Seite fragt den Anwender, bei welcher Ampelfarbe ein Fußgänger die Straße überqueren darf. Er kann zwischen Rot und Grün wählen. Je nach Antwort erscheint eine Bestätigung oder eine Fehlermeldung. Beide Varianten werden separat gecacht. Erreicht wird das durch die Angabe von VaryByParam="*" in der OutputCache-Direktive. Das bedeutet, dass für alle Parameterwerte ein eigener Cache angelegt wird. Das ist hier unbedingt nötig, denn es werden völlig unterschiedliche Ausgaben erzeugt.

<!-- cache_03.aspx --> 
<%@ Page Language="VB" Debug="True" Strict="True" %>
<%@ OutputCache Duration="10" Location="Any" 
                VaryByParam="*" %>
<script runat="server">
Sub auswahl (ByVal Sender As Object, _
             ByVal E As EventArgs)
   If AmpelListe.selectedIndex <> -1 Then
      Select Case AmpelListe.SelectedItem.value
         Case "1"
            ausgabe.InnerText ="Leider falsch!"
         Case "2"
            ausgabe.InnerText ="Das ist richtig!"
      End Select
   End If
End Sub                  
</script>
<html>
<head><title>Ein Formular cachen</title></head>
<body>
<h3>Ein Formular cachen</h3>
<p>Es ist jetzt <% = now.ToLongTimeString() %> Uhr.</p>
<form runat="server" id="myForm">
Wann darf ein Fußgänger die Straße überqueren?<br>
<asp:RadioButtonList id="AmpelListe" runat="server"
     RepeatColumns="1"
     TextAlign="Right"
     OnSelectedIndexChanged="auswahl">
     <asp:ListItem text="Bei Rot" value="1" />
     <asp:ListItem text="Bei Grün" value="2" />
</asp:RadioButtonList><br>
<asp:Button id="btnOK" runat="server" 
     Text="  OK  " /><br>
<p id="ausgabe" runat="server" />
</form></body></html>

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.2 Jede Antwortmöglichkeit muss separat gecacht werden.


Vorsicht, Falle! Wenn Sie bei einem Formular versehentlich das Attribut VaryByParam="None" angeben, dann wird stets die gleiche Ausgabe erzeugt, unabhängig von den übergebenen Parametern. Für das Beispiel mit der Ampel würde das Folgendes bedeuten: Erst wählt jemand die Antwort Bei Grün. Reaktion: Das ist richtig! Diese Reaktion wird im Cache gespeichert. Dann wählt jemand Bei Rot. Reaktion auch wieder: Das ist richtig! – denn diese Reaktion würde bei VaryByParam="None" noch im Cache liegen!

Wenn Sie Formulare cachen, müssen Sie genau überlegen, ob sich ein Cache lohnt oder nicht. Wenn Sie beispielsweise eine Suchmaschine anbieten, bei der der Anwender in ein Textfeld einen Suchausdruck frei eingeben kann, dann sollten Sie dieses Formular nicht cachen, denn die Suchausdrücke der Anwender werden völlig unterschiedlich sein. Diese Varianten zu cachen würde bedeuten, binnen kürzester Zeit den gesamten Arbeitsspeicher Ihres Servers mit unterschiedlichen Formular-Varianten zu füllen. Damit würden Sie die Leistung Ihres Systems aber nicht erhöhen, sondern beeinträchtigen.


Attribut Mögliche Werte und Bedeutung
Duration
(erforderlich)
Anzahl der Sekunden
Location Bestimmt, an welcher Stelle gecacht wird: Default-Wert ist Any: im Browser, auf einem Proxyserver oder auf dem Server Client: nur im Browser Downstream: auf jedem cachefähigen http-1.1-Gerät, also z. B. Proxyserver und Browser. Nicht auf dem Server None: Cache ist deaktiviert Server: auf dem Server Das Location-Attribut wird bei Benutzersteuerelementen nicht unterstützt.
VaryByCustom Beim Wert browser erstellt ASP.NET browserspezifische Cache-Daten. Wenn Sie hier einen individuellen String hinterlegen, müssen Sie die Methode HttpApplication.GetVaryByCustomString in der Datei Global.asax der Anwendung überschreiben.
VaryByControl Erstellt Cache-Varianten in Abhängigkeit von den hier aufgeführten Eigenschaften eines Webbenutzersteuerelements. Dieses Attribut kann nur in Webbenutzersteuerelementen verwendet werden.
VaryByHeader Erstellt mehrere Cache-Varianten in Abhängigkeit von den Werten einer Header-Variablen, z. B. VaryByHeader="Accept-Language". Mehrere Header-Variablen werden durch Semikolon voneinander getrennt. VaryByHeader kann nicht in Webbenutzersteuerelementen verwendet werden.
VaryByParam (erforderlich) Erstellt mehrere Cache-Varianten in Abhängigkeit von den Formularparametern. Werte durch Semikolon voneinander trennen oder None angeben

Tabelle 15.1 Attribute der OutputCache-Direktive

  

Einstieg in VB.NET

VB.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de