Qué es la caché
Las consultas a la base de datos o las llamadas a APIs externas tienen un coste elevado en CPU y en red, y su procesamiento puede tardar varios segundos. Si necesitas obtener los mismos datos una y otra vez, guardar el resultado en caché permite atender las peticiones posteriores mucho más rápido. Laravel ofrece una API unificada compatible con distintos backends de caché: Memcached, Redis, DynamoDB, base de datos y otros.Por defecto se utiliza el driver
database. Puedes cambiarlo a Redis o Memcached para conseguir una caché aún más rápida.Configuración de la caché
config/cache.php
La configuración de la caché se centraliza enconfig/cache.php.
La variable de entorno CACHE_STORE determina el driver por defecto.
Drivers disponibles
database (por defecto)
database (por defecto)
Guarda los datos de caché serializados en una tabla de la base de datos.
Los nuevos proyectos con Laravel 11 y posteriores incluyen la migración desde el principio.Si no se incluye la migración, créala con Artisan.
file
file
Guarda los datos de caché en el sistema de ficheros.
No requiere configuración adicional y es adecuado para aplicaciones pequeñas.
redis
redis
Driver de caché en memoria muy rápido.
Es el más habitual en producción. Requiere la extensión PhpRedis o el paquete
predis/predis.memcached
memcached
Requiere el paquete PECL de Memcached.
Configura los servidores en
config/cache.php.dynamodb
dynamodb
Utiliza AWS DynamoDB como almacén de caché.
Debes crear la tabla en DynamoDB con antelación e instalar el SDK de AWS.
storage
storage
Utiliza cualquier disco del sistema de ficheros como almacén clave/valor de caché.
Es útil si quieres reutilizar un disco S3 existente como caché.
array / null (para tests)
array / null (para tests)
array es una caché en memoria válida solo durante la petición.
null ignora todas las operaciones. Ambos resultan útiles en pruebas automatizadas.Jerarquía de drivers de caché
Elige el driver según el uso y la velocidad que necesites.Operaciones básicas
Uso del facade Cache
Utiliza el facadeCache para interactuar con la caché.
store().
Obtener datos: Cache::get()
El método get() obtiene datos de la caché.
Devuelve null si no existen. También puedes indicar un valor por defecto.
Guardar datos: Cache::put()
El método put() guarda datos en la caché. En el tercer argumento se indica el TTL en segundos.
add(), que guarda el valor solo si la clave no existe.
forever().
Obtener o guardar: Cache::remember()
Es la operación más habitual. Si la clave existe en la caché devuelve su valor; si no, ejecuta la closure y almacena el resultado.
Flujo de remember()
También existe la versión permanente rememberForever().
rememberWithWarmth(). Devuelve un array con el valor y un booleano que indica si es «cálido» (proveniente de la caché).
Stale While Revalidate (actualización flexible)
Cache::flexible() recibe un array con el «periodo de frescura» y el «periodo aceptable aunque caduco». Devuelve datos antiguos al usuario y refresca la caché en segundo plano.
Comprobar existencia: Cache::has()
Incrementar y decrementar valores
Puedes manipular contadores enteros.Obtener y eliminar: Cache::pull()
Obtiene el valor y a continuación lo elimina de la caché. Es útil para datos de un solo uso.
Eliminar datos: Cache::forget()
Cache::flushLocks() limpia todos los locks atómicos almacenados en la caché.
Ampliar el TTL: Cache::touch()
Amplía la caducidad de un elemento de caché existente.
Memoización de caché
Con el drivermemo puedes memorizar en memoria los accesos a la caché durante una misma petición.
Reduce los viajes de ida y vuelta al almacén de caché cuando se accede repetidas veces a la misma clave.
Etiquetas de caché
Puedes agrupar elementos de caché relacionados mediante etiquetas y eliminarlos en bloque.Estructura de la caché con etiquetas
Un elemento de caché con varias etiquetas puede eliminarse a través de cualquiera de ellas.Guardar y obtener con etiquetas
Borrar caché por etiquetas
Operaciones atómicas (locks)
Cache::lock() permite implementar locks distribuidos para evitar condiciones de carrera entre procesos o peticiones paralelas.
Esta función está disponible con los drivers
memcached, redis, dynamodb, database, file y array. Todos los servidores deben comunicarse con el mismo servidor central de caché.Lock básico
Esperar al lock
Espera hasta el número indicado de segundos a obtener el lock. Si se agota el tiempo se lanzaLockTimeoutException.
Evitar ejecuciones simultáneas: withoutOverlapping()
Una forma sencilla de impedir que un mismo proceso se ejecute varias veces a la vez.
Limitar la concurrencia: funnel()
Limita el número de ejecuciones en paralelo.
Transferir un lock entre procesos
Caso típico: obtener el lock en una petición web y liberarlo desde un job de la cola.forceRelease.
Refrescar el lock
Con el métodorefresh puedes ampliar la validez del lock que ya tienes. Si no indicas los segundos se usa la duración con la que se creó. Es útil para procesos largos en los que quieres ir extendiendo un lock corto en lugar de configurar de entrada un TTL muy grande.
Helper de caché
La función auxiliarcache() permite hacer lo mismo que el facade Cache con una sintaxis más breve.
Ejemplos prácticos
Cachear resultados de consultas a la base de datos
1
Cachear el resultado de la consulta en el controlador
2
Cuando los datos cambien, invalida la caché
Cachear modelos Eloquent
Cachear respuestas de una API
Gestión por grupos con etiquetas de caché
Resumen
Métodos más habituales
Métodos más habituales
Cómo elegir el driver
Cómo elegir el driver
- Desarrollo o baja escala:
fileodatabase. - Producción o alto tráfico:
redis(combinado con Laravel Horizon, además, facilita el monitoreo). - Entorno AWS:
dynamodbostorage(si reutilizas un disco S3). - Tests:
arrayonull.
Buenas prácticas de caché
Buenas prácticas de caché
- Da a las claves un nombre único en toda la aplicación (por ejemplo,
users:1:profile). - Cuando los datos cambien invalídalos con
Cache::forget()oCache::tags()->flush(). - El TTL no debe ser ni demasiado corto ni demasiado largo: ajústalo a la frecuencia con la que cambian los datos.
Cache::remember()te ayuda a escribir de forma limpia el flujo de miss.- En producción utiliza Redis y valora configurar failover.