Rendimiento Laravel – Cache

Php

Imanol Romera

  Php

La caché de Laravel puede mejorar la velocidad de tu aplicación web. En este post comparamos la velocidad de cada «driver» de caché.

Si buscas mejorar la velocidad de tu aplicación Laravel, implementar una caché para ciertos datos es una buena opción. Los casos de uso mas comúnes son para queries lentas o repetitivas, porciones HTML, respuestas o consultas a APIs externas.

Las opciones que exponemos a continuación son mas o menos ventajosas dependiendo de las circunstancias.

Las opciones (drivers) de almacenamiento que vamos a comparar son las siguientes:

  • APC
  • Base de datos (database)
  • Archivo
  • Memcached
  • Redis

Otra opción a usar, pero no probada, es:

  • Array (memoria, dura el proceso actual)

Recordamos que podemos utilizar varias en una misma petición según deseemos con el siguiente ejemplo:

Cache::store('database')->put('prueba_1', $data, $cacheTime);
Cache::store('redis')->put('prueba_2', $data, $cacheTime);

Pruebas

Probaré la velocidad de lectura y escritura de cada controlador de caché con 5 tipos diferentes de datos comúnmente almacenados en caché:

  • Numero entero
  • JSON de 100 números
  • Párrafo de 150 palabras
  • Articulo de 2500 palabras
  • Página web HTML entera

Se realizan 1000 lecturas y 1000 escrituras por cada tipo de dato. Para cada prueba, el tiempo que tarda se guardará en microsegundos y posteriormente se hará la media de estos por cada tipo de dato y driver.

Las pruebas se ejecutaron en una máquina virtual de 1GB RAM / 1 CPU. No se ha realizado ninguna modificación adicional en nuestro Laravel 6 con PHP 7.3.

Resultados

TestLecturaEscritura
Entero0.7702.416
JSON0.6792.367
Párrafo0.6312.128
Artículo0.6762.433
Web0.6942.120
APC
TestLecturaEscritura
Entero642.146390.471
JSON714.820412.997
Párrafo811.301383.895
Artículo1151.277412.056
Web3643.461765.362
Base de datos MySQL 5.7
TestLecturaEscritura
Entero1432.321137.590
JSON1353.896137.828
Párrafo1132.085161.893
Artículo1194.738173.334
Web2159.022253.023
Base de datos SQLite
TestLecturaEscritura
Entero147.06633.503
JSON132.95735.460
Párrafo153.21835.498
Artículo158.50646.110
Web395.767165.265
Archivo
TestLecturaEscritura
Entero63.50035.403
JSON63.67138.796
Párrafo63.03137.054
Artículo138.60374.496
Web1125.189842.751
Memcached
TestLecturaEscritura
Entero57.92554.762
JSON55.01354.390
Párrafo60.33856.676
Artículo44035.89978.775
Web1192.044378.57
Redis 6.0

Observaciones

Al observar los resultados anteriores, está claro que el controlador APC es, con diferencia, el controlador de caché más rápido en nuestras pruebas con velocidades mucho mejores que cualquiera de los otros. Hubo poca diferencia en los tiempos entre los conjuntos de datos más pequeños y más grandes.

A continuación, los dos drivers de caché basadas en memoria, Memcached y Redis, produjeron resultados similares, aunque las velocidades de escritura fueron ligeramente mejores en Memcached y las velocidades de lectura fueron ligeramente mejores en Redis. Es posible que haya notado la velocidad de lectura alta en los datos «artículo» en Redis. Estimo que es una anomalía para esa versión de Redis ya que con la versión 6.2 no ocurre.

El driver de archivo quedó en tercer lugar, con velocidades que duplican las alcanzadas con Redis y Memcached.

El segundo driver más lento parece ser el controlador de base de datos conectado a MySQL, con velocidades aproximadamente 5 veces más lentas que las alcanzadas con Redis y Memcached.

Finalmente, el controlador de caché más lento en nuestras pruebas fue el controlador de la base de datos conectado a SQLite (una base de datos basada en archivos planos): las velocidades parecen ser aproximadamente 10 veces más lentas que las alcanzadas con Redis y Memcached.

¿Cual utilizo?

Como mencioné al comienzo de este artículo, la respuesta probablemente sea «depende».

APC obviamente dio los mejores resultados con diferencia, sin embargo, solo puede ser utilizado por un solo proceso de PHP. Por lo tanto, si necesita acceder a sus datos almacenados en caché a través de solicitudes HTTP y CLI, o incluso a través de varios servidores, no podrá usarlos. Para aplicaciones simples de Laravel de un solo servidor, probablemente sea su mejor opción.

Si no le importa un poco de mantenimiento adicional del servidor (tener que instalar y mantener servicios adicionales), los drivers Memcached y Redis son excelentes opciones. Una herramienta de aprovisionamiento de servidores como Laravel Forge facilita la configuración inicial, y un servicio alojado completamente administrado reducirá en gran medida la cantidad de mantenimiento adicional. Si va a almacenar en caché grandes cantidades de datos, muchos proveedores de servidores ofrecen instancias de alta memoria.

Si bien el controlador basado en archivos es increíblemente fácil de configurar y ofrece velocidades aceptables, es posible que tenga problemas con la velocidad del almacenamiento del sistema si su aplicación tiene altos niveles de actividad. Puede ser una buena opción para comenzar, pero es probable que deba reemplazarlo con un driver diferente si su aplicación ve un aumento de tráfico.

Finalmente, llegamos a los drivers de base de datos. Nuevamente, son una buena opción si desea una solución rápida y fácil, ya que probablemente ya esté ejecutando una base de datos. Si el rendimiento es la prioridad, estos no serán la respuesta adecuada, ya que tienden a ser los más lentos y requerirán otros recursos del servidor, como el uso de la CPU aparte de algo de RAM y almacenamiento.