WordPress Object Caching: Redis, Memcached und native APIs

Veröffentlicht: 2017-11-04

WordPress-Websites der Enterprise-Klasse, die beliebig skaliert werden können, benötigen einen dauerhaften Caching-Mechanismus, der über Seiten und Bilder hinausgeht, einen Mechanismus, der tatsächliche PHP-Objekte zwischenspeichern kann. Obwohl WordPress einen Objekt-Caching-Mechanismus über den WordPress-Objekt-Cache bereitstellt, gibt es andere Lösungen, die eine große Hebelwirkung und Leistungsfähigkeit bieten. Aber bevor wir uns damit befassen, müssen wir zuerst sehen, was Objekt-Caching ist und wie es in PHP funktioniert.

Was ist Objekt-Caching?

PHP ist eine objektorientierte Sprache. Es verwendet das Objektparadigma, um Code zu strukturieren. Infolgedessen besteht Ihre WordPress-Site aus vielen verschiedenen PHP-Objekten, die ständig erstellt, instanziiert und zerstört werden (durch den Speichermanager). Das Erstellen und Zerstören von Objekten verursacht zusätzliche Kosten, insbesondere wenn es sich um viele handelt. Die meisten davon werden jedoch häufig wiederverwendet, da sie Kernfunktionalitäten darstellen. Dies bedeutet, dass die Anwendung sie jedes Mal, wenn sie erneut benötigt werden, von Anfang an instanziieren muss.

Was wäre, wenn Sie ein häufig verwendetes instanziiertes Objekt zwischenspeichern könnten, sodass Sie es nicht ständig zerstören und erstellen müssten?

Sie können die serialise() Funktion von PHP verwenden, um ein Objekt oder ein Grundelement in eine Zahlendarstellung (Byte-Blob) umzuwandeln, die im Arbeitsspeicher oder auf der Festplatte für den späteren Zugriff gespeichert werden kann. Dann berechnen Sie die Hash-Nummer des Byte-Blobs mit der Funktion hash() und speichern beide. Der Hash als Schlüssel und der Byte-Blob als Wert. Um es abzurufen, verwenden Sie die berechnete Hash-Nummer des Byte-Blobs, die ursprünglich als Schlüssel gespeichert wurde. Auf diese Weise können Sie alles (String, Integer, Objekt, Boolean, Array usw.) in eine speicherbare Darstellung eines Werts umwandeln.

Beispiel:

$serialized = serialize( array ( 'test' ));

Führen Sie die umgekehrte Operation mit unserialize () aus:

$original = unserialize ( $serialized );

Im Allgemeinen gibt es drei Möglichkeiten, Objekte zwischenzuspeichern: Mit dem nativen WordPress-Objektcache, der Transients-API oder einem externen Schlüsselwertspeicher wie Redis oder Memcached.

Zwischenspeichern von WordPress-Objekten

WordPress bietet zwei Objekt-Caching-APIs: Den nativen WordPress-Objekt-Cache und die Transients-API. Sie sind identisch, und obwohl dies Verwirrung stiften kann, steckt dahinter eine Logik.

Der native WordPress Object Cache kann Objekte und Primitive im Cache speichern, aber standardmäßig nicht dauerhaft. Dies bedeutet, dass das Caching im Arbeitsspeicher erfolgt und die zwischengespeicherten Objekte nicht über den Lebenszyklus der Anfrage hinaus existieren. Sie können Ihre zwischengespeicherten Objekte also nicht über verschiedene Seitenladevorgänge hinweg teilen. Sie müssen Ihre eigene Shop-Implementierung mit Drop-Ins bereitstellen, bei denen es sich um „erweiterte“ Plugins handelt, die die WordPress-Funktionalität erweitern können. Sie können sie auf Ihrem WordPress-Dashboard in der Plugin-Liste sehen:

WordPress-Drop-Ins

Die Transients-API hingegen funktioniert sofort. Sie können Variablen, Arrays, Objekte, die mit einem Ablaufdatum verknüpft sind, direkt in einer Datenbank speichern und über ein persistentes Objekt-Caching verfügen. Das Problem besteht jedoch darin, dass Ihre zwischengespeicherten Objekte, wenn sie ablaufen, in der Datenbank verbleiben und Speicherplatz beanspruchen. Dies bedeutet, dass ein zusätzlicher Overhead für die Pflege der Datenbank aufgewendet wird, indem die abgelaufenen Objekte von Zeit zu Zeit gelöscht werden.

WordPress erkennt, ob Sie Ihren eigenen persistenten Objektcache implementiert haben, und wenn dies der Fall ist, werden Aufrufe an die Transients-API umgangen und an den WordPress-Objektcache weitergeleitet (und damit der Grund dafür, dass sie identisch sind).

Entwickler können ihren eigenen Objekt-Cache implementieren, ein WordPress-Plugin (dazu später mehr) oder unsere eigene Implementierung verwenden, wenn es sich um einen Pressidium-Client handelt. Wir haben den Objektcache nicht standardmäßig aktiviert, da dies zu Leistungseinbußen führen kann, wenn er in der falschen Situation verwendet wird. Es gibt keine Einheitslösung, wenn es um das Zwischenspeichern von Objekten auf WordPress-Sites geht.

Redis und Memcache

Schlüsselwertspeicher verwenden keine Tabellen und vordefinierten Datentypen zum Speichern von Informationen in Datensätzen wie in RDBMS. Sie dienen zum Speichern und Abrufen von Schlüssel/Wert-Paaren, wie in den Wörterbuch-Datenstrukturen, die Sie in Programmiersprachen finden.

Ein gutes Beispiel für ein solches Geschäft ist Redis. Abgesehen von Dictionary-Datenstrukturen unterstützt es eine Vielzahl anderer, einschließlich erweiterter Strukturen wie sortierte Mengen mit Bereichsabfragen und Geo-Indizes mit Radiusabfragen. Es bietet persistentes Objekt-Caching .

Redis

Redis ist nicht nur ein Schlüsselwertspeicher oder Cache. Es unterstützt Datenreplikation, Scripting und Hochverfügbarkeit in einer Cluster-Konfiguration. Sie können auch den Grad der gewünschten Persistenz auf der Festplatte feinabstimmen. Das Gute an Redis ist, dass sich bei einem Neustart der größte Teil Ihres Caches immer noch auf der Festplatte befindet, wobei die verlorenen Daten nur einen kleinen Bruchteil ausmachen. Die Sache ist, dass der Server beim Neustart den Cache neu erstellen müsste, was die Last meistens erhöht. Bei Redis passiert das nicht. Außerdem werden abgelaufene Objekte sofort aus der Datenbank gelöscht. Auch dort gibt es keinen Verwaltungsaufwand.

Redis Labs hat eine hervorragende Seite, die die Anwendungsfälle von Redis im Unternehmen vorstellt: Diese reichen von sehr großen Datensätzen bis hin zu Volltextsuche, Echtzeitreihen, Spark-Integration und mehr.

Obwohl all diese Funktionen in einigen Fällen an Komplexität und möglicherweise an Geschwindigkeit kosten, kann die Optimierung Ihres Redis Drop-In-Codes einige Vorteile erzielen. Vergessen Sie nicht, dass Redis persistentes Objekt-Caching durchführt , etwas, das Memcached nicht tut, obwohl es viel einfacher zu verwenden ist.

Zwischengespeichert

Memcached ist ein leistungsstarkes In-Memory-Objekt-Caching-System, das laut der offiziellen Website speziell entwickelt wurde, um dynamische Webanwendungen zu beschleunigen und die Datenbankbelastung zu verringern. Es ist auch viel einfacher und unkomplizierter zu verwenden als Redis.

Da es speziell für das Objekt-Caching für Webseiten entwickelt wurde und eine In-Memory-Datenbank verwendet, ist es die schnellste Objekt-Caching-Lösung auf dem Markt. Wie wir jedoch bereits erwähnt haben, ist Ihr Cache leer, wenn Ihr Server neu gestartet wird. Und bis es wieder aufgebaut ist, werden Sie wahrscheinlich eine erhöhte Last erleben. Aber wie die Macher sagen: „Betrachten Sie es als Kurzzeitgedächtnis für Ihre Website“, also hängt es eher davon ab, was Sie überhaupt tun möchten.

Da Memcached eine In-Memory-Datenbank zum Aufbewahren des Cache verwendet, ist es sehr effizient beim Zwischenspeichern von SQL-Abfragen, Ausgaben von Funktionsaufrufen und dergleichen.

WordPress-Plugins

  • WP Redis, das offizielle Redis WordPress-Plugin. Unterstützt WP-CLI, Clustering und Replikation.
  • Redis Object Cache Ein weiteres Backend-Redis-Plugin für WordPress.
  • Memcached Object Cache, das Backend für Memcached.
  • Delete Expired Transients, dieses Plugin löscht abgelaufene Transienten-Objekte aus der Datenbank. Es unterstützt auch Multisites!

Wie man Benchmarks durchführt

Der Zweck unseres Artikels ist es, Sie für das Objekt-Caching zu begeistern und selbst mit dem Tüfteln zu beginnen. Sie können verschiedene persistente Cache-Implementierungen ausprobieren und sehen, wie gut sich Ihre Anwendung verhält. Sie können die microsecond()-Funktion von PHP zum Benchmarking von Aufrufen verwenden. Beispiel: Rufen Sie microsecond( microsecond() vor und nach dem Aufruf wp_cache_get() auf, subtrahieren Sie die Werte und speichern Sie das Ergebnis. Tun Sie dies für verschiedene Cache-Implementierungen und sehen Sie, in welchen Fällen Sie einen Leistungsgewinn bemerken.

Bei Pressidium ist das Objekt-Caching standardmäßig nicht aktiviert, und obwohl dies angefordert werden kann, raten wir normalerweise nicht von Anfang an dazu. Wir führen Tests durch und stellen sicher, dass Ihre Website davon profitiert.

Fazit

Nehmen wir an, dass die Anwendung zum Rendern einer Seite 2.000 transiente Objekte lesen muss. Das bedeutet 2.000 Lesezugriffe auf die Datenbank. Durch die Verwendung eines persistenten Objekt-Caching-Systems werden diese 2.000 Lesevorgänge in den Schlüsselwertspeicher ausgelagert. Wenn Sie memcached verwenden, riskieren Sie, Ihren gesamten Cache bei einem plötzlichen Neustart zu verlieren. Im Allgemeinen ist Redis möglicherweise nicht so schnell wie Memcached, aber seine Enterprise-Funktionen und seine Persistenz kommen Ihnen langfristig zugute.

Eine Größe passt jedoch nicht für alle! Zum Beispiel haben wir Redis-Instanzen gesehen, die Websites tatsächlich verlangsamt haben, und in anderen Fällen, in denen sie sie unglaublich beschleunigt haben. Dies hat mit einer Reihe von Objekten zu tun, die Ihre Anwendung verwendet: Wenn Ihre Anwendung einige wenige (sagen wir ein Dutzend) verwendet, werden Sie im Allgemeinen nicht viel vom Objekt-Caching profitieren, und im schlimmsten Fall werden Sie es tun Netzwerk-Overhead haben. Wenn Ihre Anwendung jedoch in die Hunderte geht, kann es sich lohnen, einen Blick darauf zu werfen.