Caching degli oggetti di WordPress: Redis, Memcached e API native

Pubblicato: 2017-11-04

I siti WordPress di livello aziendale che possono essere ridimensionati a piacimento, necessitano di un meccanismo di memorizzazione nella cache persistente oltre a pagine e immagini, un meccanismo in grado di memorizzare nella cache oggetti PHP reali. Sebbene WordPress fornisca un meccanismo di memorizzazione nella cache degli oggetti tramite la cache degli oggetti di WordPress, ci sono altre soluzioni che offrono una grande leva e potenza. Ma prima di entrare in tutto questo, dobbiamo prima vedere cos'è la cache degli oggetti e come funziona in PHP.

Che cos'è la memorizzazione nella cache degli oggetti?

PHP è un linguaggio orientato agli oggetti. Utilizza il paradigma Object per strutturare il codice. Di conseguenza, il tuo sito WordPress è costituito da molti oggetti PHP diversi che vengono costantemente creati, istanziati e distrutti (dal gestore della memoria). La creazione e la distruzione di oggetti ha un costo aggiuntivo, in particolare se sono molti. Tuttavia, la maggior parte di questi tende a essere riutilizzata molto poiché rappresentano funzionalità di base. Ciò significa che ogni volta che l'applicazione ne ha bisogno di nuovo, dovrà crearne un'istanza dall'inizio.

E se potessi memorizzare nella cache un oggetto istanziato di uso frequente in modo da non doverlo distruggere e creare continuamente?

È possibile utilizzare la funzione serialise() di PHP per convertire un oggetto o una primitiva in una rappresentazione numerica (blob di byte) che può essere archiviata in memoria o su disco per un accesso successivo. Quindi si calcola il numero hash del BLOB di byte utilizzando la funzione hash() e si memorizzano entrambi. L'hash come chiave e il BLOB di byte come valore. Per recuperarlo, si utilizza il numero hash calcolato del BLOB di byte che era stato inizialmente memorizzato come chiave. Puoi trasformare qualsiasi cosa (String, Integer, Object, Boolean, Array, ecc.) In una rappresentazione memorizzabile di un valore in questo modo.

Esempio:

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

Eseguire l'operazione inversa, con unserialize():

$original = unserialize ( $serialized );

In generale, ci sono tre modi per memorizzare nella cache gli oggetti: utilizzando la cache degli oggetti nativa di WordPress, l'API Transients o un archivio di valori-chiave esterno come Redis o Memcached.

Memorizzazione nella cache degli oggetti di WordPress

WordPress offre due API di memorizzazione nella cache degli oggetti: la cache degli oggetti nativa di WordPress e l'API dei transienti. Sono identici e, sebbene ciò possa causare confusione, c'è una logica dietro.

La cache degli oggetti nativa di WordPress può memorizzare oggetti e primitive nella cache, ma non in modo persistente per impostazione predefinita. Ciò significa che la memorizzazione nella cache avviene in memoria e gli oggetti memorizzati nella cache non sopravvivono oltre il ciclo di vita della richiesta. Quindi non puoi condividere i tuoi oggetti memorizzati nella cache su diversi caricamenti di pagina. Devi fornire l'implementazione del tuo negozio con l'uso di Drop-Ins, che sono plug-in "avanzati" che possono estendere le funzionalità di WordPress. Puoi vederli sulla dashboard di WordPress, nell'elenco dei plug-in:

Drop-in di WordPress

L'API Transients, d'altra parte, funziona immediatamente. Puoi salvare variabili, array, oggetti legati a una data di scadenza direttamente su un database e avere una memorizzazione nella cache degli oggetti persistente. Tuttavia, il problema è che quando gli oggetti memorizzati nella cache scadono, rimangono nel database occupando spazio. Ciò significa che c'è un sovraccarico aggiuntivo speso per la manutenzione del database, eliminando ogni tanto gli oggetti scaduti.

WordPress rileva se hai implementato la tua cache degli oggetti persistente e quando lo rileva, le chiamate all'API Transient vengono bypassate e instradate alla cache degli oggetti di WordPress (e quindi il motivo per cui sono identiche).

Gli sviluppatori possono implementare la propria cache degli oggetti, utilizzare un plug-in WordPress (ne parleremo più avanti) o la nostra implementazione, se un client Pressidium. La cache degli oggetti non è attivata per impostazione predefinita, poiché ciò può causare penalità alle prestazioni se utilizzata nella situazione sbagliata. Non esiste una soluzione "taglia unica" quando si tratta di caching degli oggetti nei siti WordPress.

Redis e Memcached

Gli archivi chiave-valore non utilizzano tabelle e tipi di dati predefiniti per archiviare informazioni in record come in RDBMS. Sono progettati per memorizzare e recuperare coppie chiave/valore, come nelle strutture dati del dizionario che trovi nei linguaggi di programmazione.

Un ottimo esempio di tale negozio è Redis. Oltre alle strutture di dati del dizionario, ne supporta una miriade di altre, comprese quelle avanzate come insiemi ordinati con query di intervallo e indici geospaziali con query di raggio. Offre una cache degli oggetti persistente .

Redis

Redis non è solo un archivio o una cache di valori-chiave. Supporta la replica dei dati, lo scripting, l'elevata disponibilità in una configurazione cluster. Puoi anche ottimizzare il livello di persistenza su disco che desideri. La cosa buona di Redis è che se esegui un riavvio, la maggior parte della tua cache sarà ancora su disco, con i dati persi solo una piccola frazione. Il fatto è che al riavvio, il server dovrebbe ricostruire la cache e questo il più delle volte aumenta il carico. Con Redis questo non accade. Inoltre, gli oggetti scaduti vengono eliminati immediatamente dal database. Anche lì non ci sono tempi di gestione generali.

Redis Labs ha un'eccellente pagina che mostra i casi d'uso Redis nell'azienda: questi vanno da set di dati molto grandi, alla ricerca full-text, serie in tempo reale, integrazione Spark e altro ancora.

Sebbene tutte queste funzionalità costino in complessità e forse in velocità in alcuni casi, l'ottimizzazione del codice Redis Drop-In può ottenere alcuni vantaggi. Non dimenticare il fatto che Redis esegue il caching degli oggetti persistente , qualcosa che Memcached non fa, sebbene sia molto più semplice da usare.

Memcached

Memcached è un sistema di caching degli oggetti in memoria ad alte prestazioni che, secondo il sito Web ufficiale, è specificamente progettato per velocizzare le applicazioni Web dinamiche e alleviare il carico del database. È anche molto più semplice e diretto da usare rispetto a Redis.

Poiché è progettato specificamente per eseguire la memorizzazione nella cache degli oggetti per le pagine Web e il fatto che utilizza un database in memoria lo rende la soluzione di memorizzazione nella cache degli oggetti più veloce disponibile. Tuttavia, come accennato in precedenza, se il tuo server si riavvia, la tua cache è esaurita. E fino a quando non verrà ricostruito, probabilmente riscontrerai un aumento del carico. Ma come dicono i creatori: "pensalo come una memoria a breve termine per il tuo sito web", quindi dipende piuttosto da cosa vuoi fare in primo luogo.

Poiché Memcached utilizza un database in memoria per mantenere la cache, è molto efficiente nella memorizzazione nella cache di query SQL, output di chiamate di funzione e simili.

Plugin WordPress

  • WP Redis, il plugin ufficiale di Redis per WordPress. Supporta WP-CLI, clustering e replica.
  • Redis Object Cache Un altro plug-in Redis back-end per WordPress.
  • Memcached Object Cache, il backend per Memcached.
  • Elimina transitori scaduti, questo plugin elimina gli oggetti transitori scaduti dal database. Supporta anche i multisiti!

Come eseguire benchmark

Lo scopo del nostro articolo è farti entusiasmare dalla memorizzazione nella cache degli oggetti e iniziare ad armeggiare da solo. Puoi provare varie implementazioni di cache persistenti e vedere come si comporta bene la tua applicazione. Puoi usare la funzione microsecond() di PHP per confrontare le chiamate. Ad esempio: chiama microsecond() prima e dopo aver chiamato wp_cache_get() , sottrai i valori e archivia il risultato. Eseguire questa operazione per varie implementazioni della cache e vedere in quali casi si nota un aumento delle prestazioni.

In Pressidium, la memorizzazione nella cache degli oggetti non è abilitata per impostazione predefinita e sebbene questo sia qualcosa che può essere richiesto, di solito non lo consigliamo dall'inizio. Eseguiamo test e ci assicuriamo che il tuo sito ne tragga vantaggi.

Conclusione

Diciamo che per eseguire il rendering di una pagina l'applicazione deve leggere 2.000 oggetti transitori. Ciò significa 2.000 letture sul database. Utilizzando un sistema di memorizzazione nella cache degli oggetti persistente, queste 2.000 letture vengono scaricate nell'archivio valori-chiave. Se usi memcached, rischi di perdere tutta la cache in un riavvio improvviso. In generale, Redis potrebbe non essere veloce come Memcached, ma le sue funzionalità Enterprise e la sua persistenza ti avvantaggiano a lungo termine.

Tuttavia, una taglia non va bene per tutti! Ad esempio, abbiamo visto istanze Redis che hanno effettivamente rallentato i siti Web e in altri casi li hanno accelerati incredibilmente. Questo ha a che fare con un certo numero di oggetti che la tua applicazione usa: in generale, se la tua applicazione ne usa pochi (diciamo una dozzina) non otterrai molti benefici dalla memorizzazione nella cache degli oggetti e, nel peggiore dei casi, otterrai avere un sovraccarico di rete. Se, tuttavia, la tua domanda è a centinaia, potrebbe essere utile dare un'occhiata.