Caché en PHP: Redis, Memcached y soluciones integradas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Caché en PHP: Redis, Memcached y soluciones integradas



El caché es una de las herramientas clave para mejorar el rendimiento de las aplicaciones web. En PHP, el desarrollador tiene varios enfoques disponibles: desde un simple caché de archivos hasta potentes sistemas en memoria, como Redis y Memcached. En este artículo, analizaremos cada opción en detalle, proporcionaremos ejemplos de código y ayudaremos a elegir la solución óptima para su proyecto.



¿Por qué es necesario el caché?

Sin caché, cada solicitud al sitio puede generar cálculos repetidos, consultas a la base de datos o API externas. El caché permite guardar el resultado de una operación costosa y devolverlo desde un almacenamiento rápido. Los principales casos de uso son:

  • Guardar resultados de consultas SQL (especialmente agregaciones y JOIN).
  • Almacenar en caché fragmentos HTML (por ejemplo, menús, barras laterales).
  • Almacenar sesiones de usuarios.
  • Almacenar en caché respuestas de API externas.


1. Redis — el rey del caché en memoria

Redis es un almacén de datos en memoria de alto rendimiento que admite estructuras de datos: cadenas, listas, hashes, conjuntos. Para PHP existen varios clientes, los más populares son predis/predis (PHP puro) y phpredis (extensión en C).



Instalación

composer require predis/predis


Ejemplo: almacenar en caché el resultado de una consulta a la base de datos

<?phprequire 'vendor/autoload.php';

use Predis\\Client;

$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);

function getUsersFromDb() { // Simulación de una consulta larga sleep(2); return ['user1', 'user2', 'user3'];}

$cacheKey = 'users:all';$cached = $redis->get($cacheKey);

if ($cached) { $users = json_decode($cached, true); echo "Desde caché: ";} else { $users = getUsersFromDb(); $redis->setex($cacheKey, 3600, json_encode($users)); // TTL 1 hora echo "Desde base de datos: ";}

print_r($users);


Funcionalidades clave de Redis:

  • setex() — establecer una clave con tiempo de vida (TTL).
  • expire() — establecer TTL para una clave existente.
  • del() — eliminar una clave.
  • incr() — incremento atómico (contadores).


2. Memcached — simplicidad y velocidad

Memcached es otro sistema popular en memoria, pero a diferencia de Redis, solo admite valores de cadena y no tiene estructuras de datos integradas. Sin embargo, para un caché simple, funciona más rápido debido a su minimalismo.



Instalación de la extensión

sudo apt install php-memcached# o mediante pecl:pecl install memcached


Ejemplo: almacenar en caché un fragmento HTML

<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);

function renderMenu() { // Generación costosa del menú return '<nav><ul><li>Inicio</li></ul></nav>';}

$menuHtml = $memcached->get('menu:main');if ($menuHtml === false) { $menuHtml = renderMenu(); $memcached->set('menu:main', $menuHtml, 600); // TTL 10 minutos}

echo $menuHtml;


Importante: Memcached no admite TTL en segundos de forma predeterminada: el tiempo se especifica en segundos (número entero). Si se pasa 0, el caché se almacenará para siempre.



3. APCu — caché integrado en PHP

APCu (Alternative PHP Cache) es una extensión para almacenar datos en caché en la memoria compartida de un solo servidor. Es ideal para aplicaciones de una sola página y proyectos pequeños.



Instalación

sudo apt install php-apcu


Ejemplo: almacenar en caché la configuración

<?php$configKey = 'app:config';

if

Recommendations