Almacenamiento en caché de objetos de WordPress: Redis, Memcached y API nativas

Publicado: 2017-11-04

Los sitios de WordPress de nivel empresarial que pueden escalar a voluntad, necesitan un mecanismo de almacenamiento en caché persistente más allá de las páginas y las imágenes, un mecanismo que pueda almacenar en caché objetos PHP reales. Aunque WordPress proporciona un mecanismo de almacenamiento en caché de objetos a través de la caché de objetos de WordPress, existen otras soluciones que ofrecen un gran apalancamiento y poder. Pero antes de entrar en todo eso, primero, necesitamos ver qué es el almacenamiento en caché de objetos y cómo funciona en PHP.

¿Qué es el almacenamiento en caché de objetos?

PHP es un lenguaje orientado a objetos. Utiliza el paradigma de objetos para estructurar el código. Como resultado, su sitio de WordPress consta de muchos objetos PHP diferentes que se crean, instancian y destruyen constantemente (mediante el administrador de memoria). Crear y destruir objetos tiene un costo general, particularmente si son muchos. Sin embargo, la mayoría de estos tienden a reutilizarse mucho, ya que representan funcionalidades básicas. Esto significa que cada vez que la aplicación los necesite nuevamente, deberá instanciarlos desde el principio.

¿Qué pasaría si pudiera almacenar en caché un objeto instanciado de uso frecuente para no tener que destruirlo y crearlo todo el tiempo?

Puede usar la función serialise() de PHP para convertir un objeto o una primitiva en una representación numérica (blob de bytes) que se puede almacenar en la memoria o en el disco para acceder a ellos más adelante. Luego, calcula el número hash del byte blob usando la hash() y almacena ambos. El hash como clave y el byte blob como valor. Para recuperarlo, utiliza el número hash calculado del blob de bytes que se almacenó inicialmente como una clave. Puede convertir cualquier cosa (cadena, entero, objeto, booleano, matriz, etc.) en una representación almacenable de un valor de esta manera.

Ejemplo:

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

Realice la operación inversa, con unserialize():

$original = unserialize ( $serialized );

En general, hay tres formas de almacenar en caché los objetos: utilizando la caché de objetos nativa de WordPress, la API de transitorios o un almacén externo de clave-valor como Redis o Memcached.

Almacenamiento en caché de objetos de WordPress

WordPress ofrece dos API de almacenamiento en caché de objetos: la caché de objetos nativa de WordPress y la API de transitorios. Son idénticos, y aunque esto puede causar confusión, hay una lógica detrás.

La caché de objetos nativa de WordPress puede almacenar objetos y primitivos en la caché, pero no de forma persistente de forma predeterminada. Esto significa que el almacenamiento en caché ocurre en la memoria y los objetos almacenados en caché no viven más allá del ciclo de vida de la solicitud. Por lo tanto, no puede compartir sus objetos almacenados en caché en diferentes cargas de página. Debe proporcionar la implementación de su propia tienda con el uso de Drop-Ins, que son complementos "avanzados" que pueden ampliar la funcionalidad de WordPress. Puede verlos en su tablero de WordPress, en la lista de complementos:

Inserciones de WordPress

La API de transitorios, por otro lado, funciona de forma inmediata. Puede guardar variables, matrices, objetos vinculados con una fecha de vencimiento directamente en una base de datos y tener un almacenamiento en caché de objetos persistente. Sin embargo, el problema es que cuando los objetos almacenados en caché caducan, permanecen en la base de datos ocupando espacio. Esto significa que se gasta una sobrecarga adicional en el mantenimiento de la base de datos, eliminando de vez en cuando los objetos caducados.

WordPress detecta si ha implementado su propia caché de objetos persistentes y, cuando descubre que ese es el caso, las llamadas a la API de transitorios se omiten y se enrutan a la caché de objetos de WordPress (y, por lo tanto, la razón por la que son idénticas).

Los desarrolladores pueden implementar su propia caché de objetos, usar un complemento de WordPress (más sobre esto más adelante) o nuestra propia implementación, si es un cliente de Pressidium. No tenemos el caché de objetos activado de forma predeterminada, ya que esto puede causar penalizaciones de rendimiento si se usa en la situación incorrecta. No existe una solución "única para todos" cuando se trata de almacenamiento en caché de objetos en sitios de WordPress.

Redis y Memcached

Los almacenes de clave-valor no utilizan tablas ni tipos de datos predefinidos para almacenar información en registros, como en RDBMS. Están diseñados para almacenar y recuperar pares clave/valor, como en las estructuras de datos del diccionario que se encuentran en los lenguajes de programación.

Un buen ejemplo de tal tienda es Redis. Además de las estructuras de datos del diccionario, admite una gran cantidad de otras, incluidas las avanzadas, como conjuntos ordenados con consultas de rango e índices geoespaciales con consultas de radio. Ofrece almacenamiento en caché de objetos persistente .

redis

Redis no es solo un almacén o caché de clave-valor. Admite replicación de datos, secuencias de comandos y alta disponibilidad en una configuración de clúster. También puede ajustar el nivel de persistencia en disco que desee. Lo bueno de Redis es que si reinicia, la mayor parte de su caché seguirá estando en el disco, y los datos perdidos serán solo una pequeña fracción. La cuestión es que al reiniciar, el servidor tendría que reconstruir el caché y esto la mayoría de las veces aumenta la carga. Con Redis esto no sucede. Además, los objetos caducados se eliminan inmediatamente de la base de datos. No hay tiempo de gastos generales de gestión allí también.

Redis Labs tiene una excelente página que muestra los casos de uso de Redis en la empresa: estos van desde conjuntos de datos muy grandes hasta búsquedas de texto completo, series en tiempo real, integración de Spark y más.

Si bien todas estas características cuestan en complejidad y, tal vez, en velocidad en algunos casos, la optimización de su código directo de Redis puede lograr bastantes ganancias. No olvide el hecho de que Redis realiza un almacenamiento persistente de objetos en caché , algo que Memcached no hace, aunque es mucho más sencillo de usar.

Memcaché

Memcached es un sistema de almacenamiento en caché de objetos de alto rendimiento en memoria que, según el sitio web oficial, está diseñado específicamente para acelerar las aplicaciones web dinámicas y aliviar la carga de la base de datos. También es mucho más simple y directo de usar que Redis.

Debido a que está diseñado específicamente para realizar el almacenamiento en caché de objetos para páginas web, y el hecho de que utiliza una base de datos en memoria, lo convierte en la solución de almacenamiento en caché de objetos más rápida que existe. Sin embargo, como mencionamos anteriormente, si su servidor se reinicia, su caché está fuera. Y hasta que se reconstruya, probablemente experimentará una mayor carga. Pero como dicen los creadores: “Piense en ello como un recuerdo a corto plazo para su sitio web”, por lo que depende más bien de lo que quiera hacer en primer lugar.

Dado que Memcached utiliza una base de datos en memoria para mantener el caché, es muy eficiente para almacenar en caché consultas SQL, resultados de llamadas a funciones, etc.

Complementos de WordPress

  • WP Redis, el complemento oficial de WordPress de Redis. Admite WP-CLI, agrupación y replicación.
  • Redis Object Cache Otro complemento de Redis de back-end para WordPress.
  • Memcached Object Cache, el backend de Memcached.
  • Eliminar transitorios caducados, este complemento elimina los objetos transitorios caducados de la base de datos. ¡Soporta multisitios también!

Cómo ejecutar puntos de referencia

El objetivo de nuestro artículo es entusiasmarte con el almacenamiento en caché de objetos y comenzar a jugar por tu cuenta. Puede probar varias implementaciones de caché persistente y ver qué tan bien se comporta su aplicación. Puede usar la función microsegundo() de PHP para comparar llamadas. Por ejemplo: llame a microsecond() antes y después de llamar a wp_cache_get() , reste los valores y almacene el resultado. Haga esto para varias implementaciones de caché y vea en qué casos nota una mejora en el rendimiento.

En Pressidium, no tenemos habilitado el almacenamiento en caché de objetos de forma predeterminada y, aunque esto es algo que se puede solicitar, generalmente no lo recomendamos desde el principio. Realizamos pruebas y nos aseguramos de que su sitio se beneficiará de ello.

Conclusión

Digamos que para representar una página, la aplicación necesita leer 2000 objetos transitorios. Eso significa 2000 lecturas en la base de datos. Mediante el uso de un sistema de almacenamiento en caché de objetos persistentes, estas 2000 lecturas se descargan en el almacén de clave-valor. Si usa Memcached, corre el riesgo de perder todo su caché en un reinicio repentino. En general, es posible que Redis no sea tan rápido como Memcached, pero sus características empresariales y su persistencia lo benefician a largo plazo.

Sin embargo, ¡una talla no sirve para todos! Por ejemplo, hemos visto instancias de Redis que en realidad ralentizaron los sitios web y, en otros casos, los aceleraron increíblemente. Esto tiene que ver con una cantidad de objetos que usa su aplicación: en general, si su aplicación usa algunos (digamos una docena), no obtendrá muchos beneficios del almacenamiento en caché de objetos y, en el peor de los casos, obtendrá tienen sobrecarga de red. Sin embargo, si su aplicación es de cientos, entonces podría valer la pena echarle un vistazo.