Cache::remember() en Laravel: qué es, cómo funciona y cuándo deberías usarlo

Cuando una aplicación consulta constantemente la misma información, especialmente si proviene de una API externa o de una consulta pesada a base de datos, repetir el mismo proceso en cada petición puede generar latencia innecesaria y aumentar el consumo de recursos.

Laravel incluye una herramienta muy práctica para resolver este tipo de escenarios: Cache::remember(). Su objetivo es sencillo: consultar primero si un valor ya existe en caché y, únicamente si no existe o expiró, ejecutar la lógica necesaria para obtenerlo nuevamente.

¿Qué hace Cache::remember()?

La forma general de utilizarlo es la siguiente:

$data = Cache::remember(
    'example.key',
    now()->addHours(24),
    function () {
        return SomeService::getData();
    }
);

Internamente, Laravel sigue una lógica equivalente a esta:

if (Cache::has('example.key')) {
    return Cache::get('example.key');
}

$data = SomeService::getData();

Cache::put(
    'example.key',
    $data,
    now()->addHours(24)
);

return $data;

La ventaja de remember() es que concentra todo ese flujo en una sola instrucción.

¿Dónde guarda Laravel la información?

El lugar donde se almacena depende del cache store configurado en Laravel. Normalmente se define desde el archivo .env.

CACHE_STORE=file

Algunos stores comunes son:

  • file: guarda la información en archivos dentro de storage/framework/cache/data.
  • database: almacena los valores en una tabla de caché dentro de la base de datos.
  • redis: utiliza Redis como almacenamiento de alto rendimiento.
  • array: mantiene los valores únicamente durante la ejecución actual, por lo que no persisten entre peticiones.

Esto significa que Cache::remember() no necesariamente guarda información solo en memoria. Con un store persistente como file, database o redis, el dato puede seguir disponible incluso después de que la petición HTTP haya terminado.

Ejemplo práctico: consumir una API externa

Supongamos que una aplicación necesita obtener un catálogo desde una API externa. Si dicho catálogo cambia pocas veces al día, consultarlo nuevamente en cada petición no tendría mucho sentido.

$icons = Cache::remember(
    'iconify.collection.mdi',
    now()->addHours(24),
    function () {
        return $this->fetchCollectionFromApi('mdi');
    }
);

La primera vez que se ejecuta, Laravel consulta la API, guarda el resultado y lo devuelve. Las siguientes peticiones recuperan directamente el valor cacheado hasta que expire.

Aplicación
   ↓
Cache::remember()
   ↓
¿Existe el dato?
   ├── Sí → devolver caché
   └── No → consultar API
              ↓
          guardar resultado
              ↓
          devolver información

¿Cuándo se recomienda usar Cache::remember()?

Es especialmente útil cuando se cumplen tres condiciones: la información se consulta con frecuencia, obtenerla tiene un costo y puede tolerar cierto tiempo sin actualizarse.

  • APIs externas: catálogos, metadatos, servicios de terceros o información que no cambia constantemente.
  • Consultas pesadas: reportes, agregaciones, conteos o dashboards que implican varias operaciones en base de datos.
  • Catálogos relativamente estáticos: países, estados, configuraciones, tipos de registros o listas de referencia.
  • Datos procesados: información que necesita varias consultas o transformaciones antes de ser mostrada.
  • Contenido muy consultado: datos que son solicitados constantemente por múltiples usuarios.

Ejemplo con una consulta a base de datos

$categories = Cache::remember(
    'categories.enabled',
    now()->addHour(),
    function () {
        return Category::where('enabled', true)
            ->orderBy('name')
            ->get();
    }
);

Mientras el caché siga vigente, Laravel evita ejecutar nuevamente la consulta y entrega el resultado almacenado.

¿Cuándo no conviene usarlo?

No todo debería almacenarse en caché. Existen datos donde la precisión en tiempo real es más importante que el rendimiento.

  • Inventario disponible.
  • Saldos financieros.
  • Estado de una transacción.
  • Disponibilidad inmediata de una reservación.
  • Información que cambia cada pocos segundos.
  • Datos críticos de seguridad sin una estrategia clara de invalidación.

En estos casos, mostrar información desactualizada podría provocar errores funcionales o incluso afectar procesos importantes del sistema.

La importancia del tiempo de expiración

Una de las decisiones más importantes al trabajar con caché es definir cuánto tiempo puede mantenerse vigente la información.

now()->addMinutes(10);
now()->addHour();
now()->addHours(24);
now()->addDay();

No existe un tiempo universal. Depende de qué tan rápido cambie el dato y cuánto tiempo sea aceptable trabajar con una versión anterior.

¿Qué pasa cuando el caché expira?

No necesitas crear un proceso adicional para actualizarlo. Cuando la entrada expira, la siguiente petición que ejecute Cache::remember() volverá a ejecutar el callback, obtendrá una versión nueva y la almacenará nuevamente.

También puedes eliminar manualmente una entrada:

Cache::forget('iconify.collection.mdi');

O limpiar todo el caché de la aplicación mediante Artisan:

php artisan cache:clear

Este último comando debe utilizarse con cuidado porque elimina todas las entradas del store de caché utilizado por la aplicación.

Una regla práctica

¿La información se consulta muchas veces?
        ↓ sí
¿Obtenerla es relativamente costoso?
        ↓ sí
¿Puede tolerar estar desactualizada algunos minutos u horas?
        ↓ sí
Cache::remember() es un buen candidato.

Conclusión

Cache::remember() es una de esas herramientas de Laravel que pueden parecer sencillas, pero generan una mejora importante cuando se utilizan en el escenario adecuado. Reduce consultas repetitivas, evita solicitudes innecesarias a servicios externos y ayuda a mejorar los tiempos de respuesta de una aplicación.

La clave no está en almacenar todo en caché, sino en identificar qué información se consulta constantemente, qué tan costoso es obtenerla y durante cuánto tiempo puede mantenerse sin actualizarse.

En Maria Tech desarrollamos soluciones de software a medida con Laravel y otras tecnologías, buscando que cada sistema sea mantenible, eficiente y preparado para crecer conforme lo requiera el negocio.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *