Heute wollen wir uns nun ein bisschen mit den Grundlagen der Programmierung mit der Komponente Memcache beschäftigen. Wir werden in dem Beispiel die Programmiersprache PHP verwenden.
Im Weiteren wird davon ausgegangen das Memcache erfolgreich installiert (einschließlich der PECL Extension) wurde und die Dämon gestartet ist.
Zunächst ein triviales Beispiel ohne Datenbank Interaktion.
Mittels:
Wird ein Memcache Objekt erzeugt und anschließend
die Verbindung zum Memcache Server hergestellt.
Nach diesen zwei kleinen Befehlen kann es im Prinzip schon ans Eingemachte gehen. Erzeugen wir erst einmal ein x-beliebiges Objekt.
$myobject->setFirstName = ‘Hans’;
$myobject->setLastName = ‘Meier’;
Im nächsten Step stecken wir das Objekt in den Memcache.
…tja einfach, oder? Schon steckt das Object im Memcache für ganze 5 Sekunden, danach fliegt es dort wieder raus.
Wollen wir auf die Daten wieder zugreifen brauchen wir den letzten grundlegenden Befehl. Mit:
Bekommen wir das Objekt wieder zurück und die Daten können ausgegeben werden (oder in einer anderen Form manipuliert werden).
Nachdem ersten kleinen HelloWorld-Beispiel wollen wir nun noch ein kleinen Schritt weitergehen und uns um das Thema Datenbank kümmern. Im Zusammenspiel mit einer Datenbank wird Einsatz von Memcache erst richtig attraktiv.
Nehmen wir als Beispiel das Thema soziale Netzwerke. In sozialen Netzwerken werden in fast jedem Feature Userprofildaten benötigt:
- Freunde
- Neue Bilder
- Profilansicht
- Nachrichten
Im klassischen Anwendungsfall müssen die Profildaten jedes Mal via Query aus der Datenbank gezogen werden. Nehmen wir folgenden trivialen Query für die Abfrage.
Im “normalen” Fall wird der User (plus oder minus) wie folgt ausgelesen.
mysql_select_db("socialnetwork");
$result = mysql_query("SELECT * FORM User WHERE Id=123");
$user = mysql_fetch_object($result)
mysql_free_result($result);
Anschließend stehen die Userdaten im User-Objekt zur Verfügung. Soweit so gut… wie kann nun Memcache in diesem Szenario weiterhelfen? Relativ einfach. Durch eine kleine Erweiterung des Codes-Snipplets können wir das Result Objekt in den Cache schieben.
$memcache->connect(‘localhost’, 11211) or die ("Could not connect");
mysql_connect("hostname", "user", "password");
mysql_select_db("socialnetwork");
$result = mysql_query("SELECT * FORM User WHERE Id=123");
$user = mysql_fetch_object($result);
$memcache->set(‘myuser’, $user, false, 5);
mysql_free_result($result);
Und schon befindet das Objekt im Cache. Bastelt man nun noch ein Abfrage in den Code hinein funktioniert das Caching schon richtig gut:
$memcache->connect(‘localhost’, 11211) or die ("Could not connect");
if($memcache->get(‘myuser’))
return $memcache->get(‘myuser’);
else
{
mysql_connect("hostname", "user", "password");
mysql_select_db("socialnetwork");
$result = mysql_query("SELECT * FORM User WHERE Id=123");
$user = mysql_fetch_object($result);
$memcache->set(‘myuser’, $user, false, 5);
mysql_free_result($result);
return $user;
}
Das Problem bis dato ist, dass für jeden Query seperat das Memcaching geregelt werden muss. Einen guten Automatismus bekommt man durch das geschickte Anlegen eines Keys. Nimmt man beispielsweise als Memcache Key den Hashwert (md5) des Querystrings dann erspart man sich einiges an Arbeit.
Einen Nachteil wollen wir an dieser Stelle nicht verschweigen, das oben gezeigte Beispiel reagiert nicht auf Änderungen (bspw. durch ein Update des Userprofils). Um dieses Feature zu berücksichtigen ist einige Logik bei der Implementierung der Update- und Create-Funktionen notwendig, so dass bei Statusänderungen in der Datenbank die relevanten Daten aus dem Memcache-Server gelöscht werden.
Prinzipiell hängt es also stark von der Anwendung ab, was die beste Caching Lösung ist.
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.