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/predisEjemplo: 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 memcachedEjemplo: 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-apcuEjemplo: almacenar en caché la configuración
<?php$configKey = 'app:config';
if También en la biblioteca
Autorización y autenticación en C# (.NET) — guía completa
Generación de PDF en C++: revisión de bibliotecas y herramientas
Biblioteca WebSocket para C# (.NET): SignalR y alternativas
Envío de correo electrónico en TypeScript: guía completa con nodemailer y SMTP