Verwenden Sie Memcached für die Leistung von Java-Unternehmen, Teil 1: Architektur und Einrichtung

Die verteilte Architektur von Memcached wurde von Danga Interactive entwickelt, um die Leistung der Website auf LiveJournal.com zu verbessern. Sie unterstützt heute die exponentielle Skalierbarkeit von sozialen Webanwendungen wie Twitter, Facebook und Wikipedia. In diesem zweiteiligen Tutorial stellt Sunil Patil die verteilte Hashtable-Architektur von Memcached vor und beginnt damit, Daten für Ihre eigenen datenbankgesteuerten Java-Unternehmensanwendungen zwischenzuspeichern.

Dieses Tutorial führt Sie in die Verwendung von Memcached ein, um die Leistung von Java-Unternehmensanwendungen zu verbessern. Die erste Hälfte beginnt mit einem Überblick über traditionelle Java-Caching-Architekturen im Vergleich zur Architektur von Memcached. Wir werden Memcached auch auf Ihrem Computer installieren und Ihnen das Setup und die Befehle für die Arbeit mit Memcached über Telnet vorstellen. In der zweiten Hälfte werden wir ein "Hello Memcached" -Client-Programm in Java entwickeln, mit dem wir unter die Haube eines spymemcached-Clients schauen. Außerdem erfahren Sie, wie Sie Memcached verwenden, um die Belastung Ihres Datenbankservers zu verringern und dynamisch generierte Seitenmarkierungen zwischenzuspeichern. Abschließend werden einige erweiterte Optionen zum Konfigurieren von Spymemcached-Clients betrachtet.

Weitere Informationen zum Java-Caching in JavaWorld

  • Weitere Informationen zum verteilten Caching mit Memcached finden Sie unter "Server-Lastausgleichsarchitekturen, Teil 1: Lastausgleich auf Transportebene".
  • Weitere Informationen zum traditionellen Java-Caching finden Sie unter "Open Source-Java-Projekte: Java-Caching-System".

Übersicht über Memcached- und Java-Caching-Architekturen

Java-Caching-Frameworks wie EHCache und OSCache sind im Wesentlichen HashMapObjekte in Ihrem Anwendungscode. Wenn Sie dem Cache ein neues Objekt hinzufügen, wird es im Speicher Ihrer Anwendung gespeichert. Diese Strategie eignet sich gut zum Speichern kleiner Datenmengen, jedoch nicht zum Zwischenspeichern von mehr als einigen Gigabyte (GB). Die Designer des Memcached-Servers verfolgten einen verteilten Architekturansatz, der die Skalierbarkeit des Systems ermöglicht. Infolgedessen können Sie Memcached verwenden, um eine große Datenmenge zwischenzuspeichern.

Die Architektur von Memcached besteht aus zwei Teilen. Erstens ist ein Memcached-Server, der in einem eigenen Prozess ausgeführt wird. Wenn Sie Ihre Anwendung skalieren möchten, können Sie den Memcached-Server auf zusätzlichen Computern installieren und ausführen. Instanzen des Memcached-Servers kennen sich nicht. Das Memcached - Client, das zweite Stück des Memcached - Systems, nicht weiß , über jeden des Servers. Der Client ist dafür verantwortlich, den Server für jeden Cache-Eintrag abzuholen und den Cache-Eintrag entweder zu speichern oder abzurufen - ein Vorgang, auf den ich später in diesem Artikel näher eingehen werde.

Wenn Sie Erfahrung mit Java EE-Webanwendungen haben, haben Sie wahrscheinlich zuvor ein Open-Source-Java-Caching-Framework wie EHCache oder OSCache verwendet. Möglicherweise haben Sie auch ein kommerzielles Caching-Framework verwendet, das als Teil Ihres Anwendungsservers geliefert wurde, z. B. DynaCache (im Lieferumfang von IBM WebSphere Application Server enthalten) oder JBoss Cache (im Lieferumfang von JBoss AS enthalten). Bevor wir uns mit dem praktischen Lernen dieses Tutorials befassen, ist es wichtig zu verstehen, wie sich Memcached von diesen traditionellen Java-Caching-Frameworks unterscheidet.

Verwendung eines herkömmlichen Java-Cache

Die Verwendung eines herkömmlichen Java-Caching-Frameworks ist recht einfach, unabhängig davon, ob Sie sich für eine Open Source- oder eine kommerzielle Option entscheiden. Für ein Open Source-Framework wie EHCache oder OSCache müssten Sie die Binärdateien herunterladen und die erforderlichen JAR-Dateien zum Klassenpfad Ihrer Anwendung hinzufügen. Möglicherweise müssen Sie auch eine Konfigurationsdatei erstellen, mit der Sie die Größe des Caches, das Auslagern der Festplatte usw. konfigurieren. Für ein Caching-Framework, das mit einem Anwendungsserver gebündelt wurde, müssten Sie normalerweise keine zusätzlichen JARs herunterladen, da diese mit der Software gebündelt werden.

Nachdem Sie die Unterstützung für das Caching-Framework in Ihrer Anwendung hinzugefügt haben, können Sie es verwenden, indem Sie ein CacheManagerObjekt erstellen und Cache-Einträge darin abrufen und festlegen. Unter der Haube würde das Caching-Framework die CacheManagerObjekte in derselben JVM erstellen , in der Ihre Anwendung ausgeführt wurde. Jedes Mal, wenn Sie einen Cache-Eintrag hinzufügen, wird dieses Objekt auch zu einer Art von Hashtabelle hinzugefügt, die vom Caching-Framework verwaltet wird.

Wenn Ihr Anwendungsserver auf mehreren Knoten ausgeführt wurde, möchten Sie möglicherweise auch Unterstützung für verteiltes Caching. Wenn Sie in einem verteilten Cache-System ein Objekt im Cache auf AppServer1 hinzufügen, ist dieses Objekt auch auf AppServer2 und AppServer3 verfügbar. Herkömmliche Java-Caches verwenden die Replikation für das verteilte Caching. Wenn Sie also einen Cache-Eintrag auf AppServer1 hinzufügen, wird dieser automatisch auf die anderen App-Server in Ihrem System repliziert. Infolgedessen ist der Eintrag auf allen Ihren Knoten verfügbar.

Verwenden von Memcached

Um Memcached für das Caching verwenden zu können, müssen Sie zuerst den Memcached-Server für die Plattform Ihrer Wahl herunterladen und installieren. Sobald Sie den Memcached-Server installiert haben, überwacht er entweder einen TCP- oder einen UDP-Port, um Anrufe zwischenzuspeichern.

Als Nächstes laden Sie einen Java-Client für Memcached herunter und fügen die Client-JARs zu Ihrer Anwendung hinzu. Danach können Sie ein Memcached-Client-Objekt erstellen und dessen Methode aufrufen, um Cache-Einträge abzurufen und festzulegen. Wenn Sie dem Cache ein Objekt hinzufügen, nimmt der Memcached-Client dieses Objekt, serialisiert es und sendet ein Byte-Array zur Speicherung an den Memcached-Server. Zu diesem Zeitpunkt handelt es sich bei dem zwischengespeicherten Objekt möglicherweise um Müll, der von der JVM gesammelt wurde, in der Ihre Anwendung ausgeführt wird.

Wenn Sie dieses zwischengespeicherte Objekt benötigen, können Sie die get()Methode des Memcached-Clients aufrufen . Der Client nimmt die getAnforderung entgegen, serialisiert sie und sendet sie an den Memcached-Server. Der Memcached-Server verwendet die Anforderung, um das Objekt aus dem Cache nachzuschlagen. Sobald das Objekt vorhanden ist, wird das Byte-Array an den Memcached-Client zurückgegeben. Das Memcached-Client-Objekt nimmt dann das Byte-Array und deserialisiert es, um das Objekt zu erstellen und an Ihre Anwendung zurückzugeben.

Selbst wenn Ihre Anwendung auf mehr als einem Anwendungsserver ausgeführt wird, können alle auf denselben Memcached-Server verweisen und ihn zum Abrufen und Festlegen von Cache-Einträgen verwenden. Wenn Sie mehr als einen Memcached-Server haben, wissen die Server nichts voneinander. Stattdessen konfigurieren Sie Ihren Memcached-Client so, dass er alle verfügbaren Memcached-Server kennt. Wenn Ihre Anwendung beispielsweise ein Java-Objekt auf AppServer1 erstellt und die set()Methode Memcached aufruft , ermittelt der Memcached-Client, an welchen Memcached-Server dieser Eintrag gesendet wird. Es wird dann nur mit diesem Memcached-Server kommuniziert. Wenn Ihr Code in AppServer2 oder AppServer3 versucht, geteinen Eintrag zu erstellen , ermittelt der Memcached-Client zunächst, auf welchem ​​Server dieser Eintrag gespeichert ist, und kommuniziert dann nur mit diesem Server.

Gespeicherte Client-Logik

In seiner Standardkonfiguration verwendet der Memcached-Client eine sehr einfache Logik, um den Server für eine Get- oder Set-Operation auszuwählen. Wenn Sie einen get()oder einen set()Anruf tätigen , nimmt der Client den Cache-Schlüssel und ruft seine hashCode()Methode auf, um eine Ganzzahl wie 11 abzurufen. Anschließend nimmt er diese Nummer und dividiert sie durch die Anzahl der verfügbaren Memcached-Server, z. B. zwei. Es nimmt dann den Wert des Restes an, der in diesem Fall 1 ist. Der Cache-Eintrag wird an Memcached Server 1 gesendet. Dieser einfache Algorithmus stellt sicher, dass der Memcached Client auf jedem Ihrer Anwendungsserver immer denselben Server für einen bestimmten Cache-Schlüssel auswählt.

Memcached installieren

Memcached läuft unter Unix, Linux, Windows und MacOSX. Sie können entweder die Memcached-Quelle herunterladen und kompilieren oder die von einer anderen Person kompilierten Binärdateien herunterladen und zur Installation von Memcached verwenden. Hier werde ich den Prozess des Herunterladens der Binärdateien für die Plattform Ihrer Wahl durchgehen. Weitere Informationen finden Sie unter Ressourcen, wenn Sie lieber aus dem Quellcode kompilieren möchten.

Die folgenden Installationsanweisungen gelten für einen Windows XP 32-Bit-Computer. Installationsanweisungen für andere Plattformen wie Linux finden Sie unter Ressourcen. Beachten Sie auch, dass der Beispielcode für diesen Artikel auf einem Windows XP 32-Bit-Computer entwickelt wurde, obwohl er auf jeder anderen Plattform funktionieren sollte.

  1. Jellycan-Code verfügt über eine modifizierte Version von Memcached, mit der einfach und effizient gearbeitet werden kann. Beginnen Sie hier, indem Sie die bin32-ZIP-Datei win32 herunterladen
  2. Erweitern Sie Memcached--win32-bin.zipauf Ihrer Festplatte. Beachten Sie, dass alles, was es enthält, ist memcached.exe. Führen Sie diese Datei aus, um den Memcached-Server zu starten.
  3. memcached.exe -d installFühren Sie nun aus, um memcached.exe als Dienst zu registrieren. Über die Dienstekonsole können Sie den Memcached-Server starten und stoppen.

CL Start / Stopp

Versuchen Sie, den Memcached-Server über die Befehlszeile anstatt über ein Servicefenster zu starten und zu stoppen. Auf diese Weise erhalten Sie mehr Flexibilität, um verschiedene Befehlszeilenoptionen auszuprobieren und die bestmögliche Konfiguration für Ihre Anforderungen zu finden.

Wenn Sie die memcached.exeOption ohne Befehlszeilenoptionen ausführen , wird der Memcached-Server standardmäßig an Port 11211 mit 64 MB Speicher gestartet. In einigen Fällen möchten Sie möglicherweise eine genauere Kontrolle über die Konfiguration haben. Angenommen, Port 11211 wird von einem anderen Prozess auf Ihrem Computer verwendet, und Sie möchten, dass der Memcached-Server Port 12000 verwendet. Wenn Sie den Memcached-Server in einer QS- oder Produktionsumgebung starten, möchten Sie ihm mehr Speicher als die Standard-64 MB zuweisen. In diesen Fällen können Sie Befehlszeilenoptionen verwenden, um das Verhalten des Servers anzupassen. Wenn Sie den memcache.exe -helpBefehl ausführen , erhalten Sie eine vollständige Liste der Befehlszeilenoptionen wie in Abbildung 3 dargestellt.

Verbinden Sie sich mit Memcached über Telnet

Nachdem der Memcached-Server gestartet wurde, überwacht er den Port, dem Sie ihn zugewiesen haben. Der Memcached-Client stellt entweder über den TCP- oder den UDP-Port eine Verbindung zum Server her, sendet Befehle und empfängt Antworten und schließt schließlich die Verbindung. (Weitere Informationen zu dem Protokoll, mit dem der Client mit dem Server kommuniziert, finden Sie unter Ressourcen.)

Sie können auf verschiedene Arten eine Verbindung zu Ihrem Memcached-Server herstellen. Wenn Sie wie in der zweiten Hälfte dieses Tutorials einen Java-Client verwenden, können Sie auf eine einfache API zum Speichern und Abrufen von Objekten aus dem Cache zugreifen. Alternativ können Sie einen Telnet-Client verwenden, um eine direkte Verbindung zum Server herzustellen. Für das Debuggen des Java-Clients ist es wichtig zu wissen, wie der Telnet-Client für die Kommunikation mit dem Memcached-Server verwendet wird. Daher beginnen wir dort.

Telnet-Befehle

Zuerst müssen Sie den Telnet-Client Ihrer Wahl verwenden, um eine Verbindung zum Memcached-Server herzustellen. Auf einem Windows XP-Computer können Sie einfach ausführen, telnet localhost 11211vorausgesetzt, der Memcached-Server wird auf demselben Computer ausgeführt und überwacht den Standard-11211-Port. Die folgenden Befehle sind für die Arbeit mit Memcached über Telnet wichtig:

  • setFügt dem Cache ein neues Element hinzu. Der Anruf lautet : Set . Sie können den tatsächlichen Wert eingeben, der in der nächsten Zeile gespeichert werden soll. Wenn Sie nicht möchten, dass der Cache-Eintrag abläuft, geben Sie 0 als Wert ein.
  • getGibt den Wert des Cache-Schlüssels zurück. Verwenden Sie get , um den Wert von zu erhalten keyName.
  • addFügt einen neuen Schlüssel nur hinzu, wenn er noch nicht vorhanden ist. Zum Beispiel:add
  • replaceersetzt einen Wert nur, wenn der Schlüssel vorhanden ist. Zum Beispiel:replace
  • deletelöscht den Cache-Eintrag für den Schlüssel. Mit dem Aufruf können Sie den delete Wert von löschen keyName.

Der Screenshot in Abbildung 4 zeigt eine Beispielinteraktion mit dem Memcached-Server über Telnet. Wie Sie sehen können, bietet der Memcached - Server Feedback zu jedem Befehl, wie STORED, NOT_STOREDund so weiter.

Schlussfolgerung zu Teil 1

Bisher haben wir kurz die Unterschiede zwischen der verteilten Architektur von Memcached und traditionelleren Java-Cache-Systemen erörtert. Wir haben auch eine Memcached-Implementierung in Ihrer Entwicklungsumgebung eingerichtet und Sie haben das Herstellen einer Verbindung zu Memcached über Telnet geübt. Im nächsten Teil dieses Tutorials verwenden wir den Java-Client spymemcached, um eine verteilte Caching-Lösung für eine Java-Beispielanwendung einzurichten. Dabei erfahren Sie viel mehr über Memcached und wie es die Leistung Ihrer Java EE-Anwendungen verbessern kann.

Sunil Patil ist ein Java EE-Architekt, der für Avnet Technology in San Francisco, Kalifornien, arbeitet. Er ist Autor von Java Portlets 101 (SourceBeat, April 2007) und hat zahlreiche Artikel verfasst, die von JavaWorld, IBM developerWorks und O'Reilly Media veröffentlicht wurden. Er ist nicht nur IBM Certified WebSphere Portal Server-Anwendungsentwickler und -verwalter, sondern auch Sun Microsystems Certified Java Programmer, Webkomponentenentwickler und Geschäftskomponentenentwickler. Sie können Sunils Blog unter //www.webspherenotes.com anzeigen.