16.6 Caching mit memcached 

Grundlagen 

Für große Websites
Für Websites mit extrem viel Traffic kann die Caching-Technologie memcached eingesetzt werden. memcached wurde urspünglich für die Website LiveJournal entwickelt, um die Datenbankabfragen im Haupspeicher (RAM) zwischenzuspeichern. Inzwischen wird memcached von einigen großen Websites wie YouTube, Wikipedia, Facebook und digg eingesetzt.
Da in den meisten Fällen der Datenbankzugriff der »Flaschenhals« einer Webapplikation ist, kann durch Einsatz von memcached die Performance erheblich gesteigert werden.
memcached-Server
Um memcached einzusetzen, muss auf dem Server ein memcached-Hintergrundprozess oder memcached-Server laufen, der für das Caching zuständig ist. Dieser Hintergrundprozess fungiert im Prinzip als Hash-Speicher, in dem Key-Value-Paare gespeichert werden können. Das Ergebnis einer Datenbankabfrage wird in einem Value gespeichert. Um dieses Ergebnis später wiederzufinden, wird es unter einem Namen, dem Key, im memcached-Server gespeichert. Die Webapplikation sendet ein Key-Value-Paar an den Server zum Cachen einer Datenbankabfrage oder stellt über einen Key eine Anfrage und erhält, falls vorhanden, den Value zurück.
Abbildung memcached-Client und -Server
Sicherheit
Aus Sicherheitsgründen muss dafür gesorgt werden, dass nur autorisierte Applikationen auf den memcached-Server zugreifen können. Der memcached-Server bietet selbst keinen Schutzmechanismus an. Daher sollte auf dem Server z. B. eine Firewall entsprechend konfiguriert werden.
Erreichbarkeit
Beim Einsatz des memcached-Servers ist außerdem darauf zu achten, dass er immer erreichbar ist. Sollte es zu Problemen kommen, ist auch die Webapplikation, die memcached verwendet, nicht mehr erreichbar.
Da die Konfiguration und der Betrieb eines Servers mit memcached viel Erfahrung benötigt, empfehlen wir dem Leser, erst dann memcached einzusetzen, wenn die Caching-Technologien, die Rails anbietet, nicht mehr ausreichen.
memcached-Client
Ein memcached-Client ist bisher in Rails von Haus aus noch nicht integriert. Es gibt jedoch Erweiterungen, mit denen memcached in Rails genutzt werden kann.
Ab Rails 2.1 ist memcached integriert |
Ab der Version 2.1 von Rails wird die Funktionalität in das Framework integriert. Zum Zeitpunkt des Drucks dieses Buches war diese Version noch nicht veröffentlicht. Falls Sie Version 2.1 bereits einsetzen, schauen Sie bitte auf der Website zum Buch ( http://www.railsbuch.de ) nach, ob aktualisierte Informationen zu diesem Thema vorliegen. |
Wir gehen in diesem Abschnitt daher nur grundlegend auf das Thema ein.
Dieser Abschnitt soll Ihnen einen Überblick vermitteln, wie memcached in Rails eingesetzt werden kann. Aufgrund der komplexen Thematik kann memcached hier nicht umfassend behandelt werden.
Installation 

Um auf den memcached-Server aus einer Webapplikation zugreifen zu können, benötigt man einen memcached-Client. Für Ruby bzw. Rails gibt es das RubyGems-Paket memcache-client .
Mit diesem Plug-in kann man nicht nur ActiveRecord-Datenbank-Abfragen cachen, sondern auch die Dateien des Fragment-Caching, um noch eine höhere Performance zu erreichen.
Installation des memcached-Servers 

Es ist sehr empfehlenswert, den memcached-Server auf dem Entwicklungsrechner zu installieren, obwohl es nur auf dem Produktionsrechner erforderlich ist, damit Sie auch lokal überprüfen können, ob die Skripte laufen.
Mac OS X
Unter Mac OS X kann der memcached-Server am einfachsten mit dem Paketmanagement-System Mac Ports installiert werden.
Listing Installation des memcached-Servers unter Mac OS X
sudo port install memcached
Windows
Von der Website http://jehiah.cz/projects/memcached-win32/ kann die Windows-Version heruntergeladen werden.
Ubuntu und Debian
Unter Ubuntu oder Debian kann der memcached-Server mit dem apt-get - oder aptitude -Befehl installiert werden:
Listing Installation des memcached-Servers unter Ubuntu und Debian
aptitude install memcached
Für die Dokumentation und Installation des memcached-Servers siehe auch http://danga.com/memcached/
Damit Ruby bzw. Ruby on Rails auf den memcached-Server zugreifen kann, muss ein Client für den memcached-Server installiert werden. Wir verwenden dazu das RubyGems-Paket memcache-client:
Listing Installation des memcache-Client
sudo gem install memcache-client
Mit dem Rails-Plug-in cache_fu ist die Integration des Clients memcache-client in Ihre Rails-Applikation relativ leicht:
Listing Installation des Cache-Fu-Plug-ins
ruby script/plugin install \ svn://errtheblog.com/svn/plugins/cache_fu
Konfigurieren
Während der Installation wird im config -Verzeichnis die Konfigurationsdatei memcached.yml angelegt, in der der memcache-client für den Zugriff auf den memcached-Server konfiguriert wird. Wenn auf dem Entwicklungsrechner der memcached-Server installiert ist, so wird die Konfigurationsdatei entsprechend automatisch angepasst. Es ist zu beachten, dass auf dem Produktionsserver gegebenenfalls andere Einstellungen vorzunehmen sind.
Verwendung 

Um sämtliche Datenbankabfragen zu cachen, muss im entsprechenden Model der Befehl acts_as_cached hinzugefügt werden:
Listing app/models/product.rb
class Product < ActiveRecord::Base acts_as_cached end
Es ist sinnvoll, nur die Datenbankabfragen zu cachen, die für die Öffentlichkeit bestimmt sind. Es gibt auch die Möglichkeit, nur bestimmte Abfragen zu cachen. Angenommen, wir hätten ein Feld enabled, das angibt, ob das Produkt für die Öffentlichkeit sichtbar ist:
Listing app/models/product.rb
class Product < ActiveRecord::Base
acts_as_cached :conditions => 'enabled = 1'
end
memcached-Server starten
Bevor die Applikation mit ruby script/server gestartet werden kann, muss vorher der memcached-Server gestartet werden. Das Plug-in hat Rake-Tasks zum Starten, Stoppen und Neustarten installiert. Zum Starten des memcached-Servers rufen Sie einfach den folgenden Rake-Task auf:
rake memcached:start
Löschen des Caches 

Zum Löschen des Caches steht die Methode expire_cache zur Verfügung.
Damit der Cache nach jedem Speichern gelöscht wird, kann der Befehl wie folgt eingesetzt werden:
Listing app/models/product.rb
class Product < ActiveRecord::Base
acts_as_cached :conditions => 'enabled = 1'
after_save :expire_cache
end
Cache-Fu
Das Cache-Fu-Plug-in bietet noch eine Reihe von weiteren Features, wie z. B. das Löschen des Caches zu einer festgelegten Zeit.
Weitere Informationen zu dem Cache-Fu-Plug-in erhalten Sie auf der Webseite http://errtheblog.com/posts/57-kickin-ass-w-cachefu .
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.