05.122012

Performanceoptimierung durch Caching

Hey,

je größer und beliebter eine Webanwendung ist, desto wichtiger ist es, dass sie performant ist und schnell reagiert. Blöd nur, dass die meisten Komponenten mit steigender Zugriffszahl immer langsamer werden, sei es der Apache,  die Hardware, worauf der Webserver laeuft oder das komplette Netzwerk.

Was kann man dagegen tun? Klar, mehr Hardware hinstellen, das klappt fast immer :-)

Flaschenhals Nr. 1 ist aber in der Regel die Datenbank, hier ist es unter Umständen auch gar nicht so leicht die Last auf mehrere Server zu verteilen, schließlich müssten dann ja alle Datenbankserver zu jeder Zeit völlig identische Daten haben.
Auch dafür gibt es Lösungen, aber zu allererst versucht man die Datenbankzugriffe zu reduzieren.

Nehmen wir an ihr habt einen Onlineshop mit vielen verschiedenen Waren. Bei jedem Klick auf einen bestimmten Artikel werden die nötigen Informationen aus der Datenbank gelesen. Preis, Beschreibung, Technische Merkmale, Verfügbarkeit etc. etc.

Welchen Grund gibt es, dass bei wirklich jedem Aufruf die Daten aus der Datenbank gelesen werden? Wie oft ändert sich Preis, Beschreibung etc.? Richtig, so gut wie nie!

Nach dem Auslesen aus der Datenbank speichern wir die Daten einfach an anderer Stelle, werden die Daten noch einmal abgefragt, schauen wir zuerst nach, ob wir sie im Cache haben, ist das nicht der Fall, laden wir sie aus der DB und speichern sie dann wieder im Cache.

Eine sehr einfache Variante wäre es, das serialisierte Array der Daten einfach als PHP-Datei auf der Festplatte zu speichern.
Es gibt aber auch speziell dafür geschriebene Software wie http://memcached.org/ oder http://redis.io/.

Solche sogenannten Key-Value Storages bieten natürlich noch einige andere Vorteile.
Beispielsweise kann man ihnen eine Lebensdauer für einen Cacheeintrg mitgeben,
sodass ein Cacheeintrag automatisch nach bspw. 12 Stunden ungültig wird.
Außerdem könnt ihr Einträge gezielt invalidieren (also ungültig machen)

Sollte sich also doch mal ein Preis oder die Artikelbeschreibung ändern, so ist das kein Problem, der entsprechende Eintrag im Cache wird einfach invalidiert und beim nächsten Aufruf kommen die Daten genau 1x aus der Datenbank, bevor sie wieder in den Cache geschrieben werden!

Zugegeben, das ganze ist sehr simpel, aber ich merke immer wieder, dass es viele Leute gibt, die sich darueber noch keine Gedanken gemacht haben, ist bei kleinen Websites vll. auch nicht unbedingt erforderlich, aber spätestens im Berufsleben werdet ihr es brauchen ! ;-)