Skip to main content

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 en config/cache.php. La variable de entorno CACHE_STORE determina el driver por defecto.

Drivers disponibles

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.
Guarda los datos de caché en el sistema de ficheros. No requiere configuración adicional y es adecuado para aplicaciones pequeñas.
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.
Requiere el paquete PECL de Memcached. Configura los servidores en config/cache.php.
Utiliza AWS DynamoDB como almacén de caché. Debes crear la tabla en DynamoDB con antelación e instalar el SDK de AWS.
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 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 facade Cache para interactuar con la caché.
Para alternar entre varios almacenes utiliza el método 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.
También existe add(), que guarda el valor solo si la clave no existe.
Para guardar de forma permanente utiliza 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.
Cache::remember() reduce a una sola línea el patrón «comprobar la caché → si no está, obtener el valor → almacenarlo». Es ideal para cachear resultados de consultas a base de datos o respuestas de APIs externas.

Flujo de remember()

También existe la versión permanente rememberForever().
Si necesitas saber si la caché ha «acertado» o si el valor se acaba de generar en la closure, utiliza rememberWithWarmth(). Devuelve un array con el valor y un booleano que indica si es «cálido» (proveniente de la caché).
rememberWithWarmth() es útil para monitorizar la eficiencia de la caché. Si $warm es false la mayoría de las veces, puede que te convenga ajustar el TTL.

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::flush() elimina todas las entradas independientemente del «prefijo» de caché. Ten cuidado si compartes la caché entre varias aplicaciones.
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 driver memo 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.
Las etiquetas de caché no están soportadas por los drivers file, dynamodb, database ni storage. Necesitas redis o memcached.

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

Las etiquetas son útiles cuando quieres invalidar caché por grupos (por usuario, por artículo, etc.). Ejemplo: Cache::tags(['user', "user:{$userId}"])->flush() borra todas las cachés de ese usuario.

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

Si le pasas una closure, el lock se libera automáticamente cuando termina.

Esperar al lock

Espera hasta el número indicado de segundos a obtener el lock. Si se agota el tiempo se lanza LockTimeoutException.
Con una closure el código queda más limpio.

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.
Para liberar el lock de forma forzada, sin importar el propietario actual, utiliza el método forceRelease.

Refrescar el lock

Con el método refresh 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 auxiliar cache() 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

  • Desarrollo o baja escala: file o database.
  • Producción o alto tráfico: redis (combinado con Laravel Horizon, además, facilita el monitoreo).
  • Entorno AWS: dynamodb o storage (si reutilizas un disco S3).
  • Tests: array o null.
  • 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() o Cache::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.
Última modificación el 13 de julio de 2026