{"id":324,"date":"2026-10-15T10:16:08","date_gmt":"2026-10-15T17:16:08","guid":{"rendered":"https:\/\/www.mariatech.com.mx\/blog\/?p=324"},"modified":"2026-10-15T10:19:14","modified_gmt":"2026-10-15T17:19:14","slug":"cache-remember-laravel-como-funciona-cuando-usarlo","status":"publish","type":"post","link":"https:\/\/www.mariatech.com.mx\/blog\/laravel-php\/cache-remember-laravel-como-funciona-cuando-usarlo\/","title":{"rendered":"Cache::remember() en Laravel: qu\u00e9 es, c\u00f3mo funciona y cu\u00e1ndo deber\u00edas usarlo"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cuando una aplicaci\u00f3n consulta constantemente la misma informaci\u00f3n, especialmente si proviene de una API externa o de una consulta pesada a base de datos, repetir el mismo proceso en cada petici\u00f3n puede generar latencia innecesaria y aumentar el consumo de recursos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel incluye una herramienta muy pr\u00e1ctica para resolver este tipo de escenarios: <code>Cache::remember()<\/code>. Su objetivo es sencillo: consultar primero si un valor ya existe en cach\u00e9 y, \u00fanicamente si no existe o expir\u00f3, ejecutar la l\u00f3gica necesaria para obtenerlo nuevamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 hace Cache::remember()?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La forma general de utilizarlo es la siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$data = Cache::remember(\n    'example.key',\n    now()-&gt;addHours(24),\n    function () {\n        return SomeService::getData();\n    }\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Internamente, Laravel sigue una l\u00f3gica equivalente a esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Cache::has('example.key')) {\n    return Cache::get('example.key');\n}\n\n$data = SomeService::getData();\n\nCache::put(\n    'example.key',\n    $data,\n    now()-&gt;addHours(24)\n);\n\nreturn $data;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La ventaja de <code>remember()<\/code> es que concentra todo ese flujo en una sola instrucci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfD\u00f3nde guarda Laravel la informaci\u00f3n?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El lugar donde se almacena depende del <em>cache store<\/em> configurado en Laravel. Normalmente se define desde el archivo <code>.env<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CACHE_STORE=file<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Algunos stores comunes son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>file:<\/strong> guarda la informaci\u00f3n en archivos dentro de <code>storage\/framework\/cache\/data<\/code>.<\/li>\n\n\n\n<li><strong>database:<\/strong> almacena los valores en una tabla de cach\u00e9 dentro de la base de datos.<\/li>\n\n\n\n<li><strong>redis:<\/strong> utiliza Redis como almacenamiento de alto rendimiento.<\/li>\n\n\n\n<li><strong>array:<\/strong> mantiene los valores \u00fanicamente durante la ejecuci\u00f3n actual, por lo que no persisten entre peticiones.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esto significa que <code>Cache::remember()<\/code> no necesariamente guarda informaci\u00f3n solo en memoria. Con un store persistente como <code>file<\/code>, <code>database<\/code> o <code>redis<\/code>, el dato puede seguir disponible incluso despu\u00e9s de que la petici\u00f3n HTTP haya terminado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo pr\u00e1ctico: consumir una API externa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Supongamos que una aplicaci\u00f3n necesita obtener un cat\u00e1logo desde una API externa. Si dicho cat\u00e1logo cambia pocas veces al d\u00eda, consultarlo nuevamente en cada petici\u00f3n no tendr\u00eda mucho sentido.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$icons = Cache::remember(\n    'iconify.collection.mdi',\n    now()-&gt;addHours(24),\n    function () {\n        return $this-&gt;fetchCollectionFromApi('mdi');\n    }\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Aplicaci\u00f3n\n   \u2193\nCache::remember()\n   \u2193\n\u00bfExiste el dato?\n   \u251c\u2500\u2500 S\u00ed \u2192 devolver cach\u00e9\n   \u2514\u2500\u2500 No \u2192 consultar API\n              \u2193\n          guardar resultado\n              \u2193\n          devolver informaci\u00f3n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfCu\u00e1ndo se recomienda usar Cache::remember()?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es especialmente \u00fatil cuando se cumplen tres condiciones: la informaci\u00f3n se consulta con frecuencia, obtenerla tiene un costo y puede tolerar cierto tiempo sin actualizarse.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>APIs externas:<\/strong> cat\u00e1logos, metadatos, servicios de terceros o informaci\u00f3n que no cambia constantemente.<\/li>\n\n\n\n<li><strong>Consultas pesadas:<\/strong> reportes, agregaciones, conteos o dashboards que implican varias operaciones en base de datos.<\/li>\n\n\n\n<li><strong>Cat\u00e1logos relativamente est\u00e1ticos:<\/strong> pa\u00edses, estados, configuraciones, tipos de registros o listas de referencia.<\/li>\n\n\n\n<li><strong>Datos procesados:<\/strong> informaci\u00f3n que necesita varias consultas o transformaciones antes de ser mostrada.<\/li>\n\n\n\n<li><strong>Contenido muy consultado:<\/strong> datos que son solicitados constantemente por m\u00faltiples usuarios.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo con una consulta a base de datos<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>$categories = Cache::remember(\n    'categories.enabled',\n    now()-&gt;addHour(),\n    function () {\n        return Category::where('enabled', true)\n            -&gt;orderBy('name')\n            -&gt;get();\n    }\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mientras el cach\u00e9 siga vigente, Laravel evita ejecutar nuevamente la consulta y entrega el resultado almacenado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfCu\u00e1ndo no conviene usarlo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No todo deber\u00eda almacenarse en cach\u00e9. Existen datos donde la precisi\u00f3n en tiempo real es m\u00e1s importante que el rendimiento.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inventario disponible.<\/li>\n\n\n\n<li>Saldos financieros.<\/li>\n\n\n\n<li>Estado de una transacci\u00f3n.<\/li>\n\n\n\n<li>Disponibilidad inmediata de una reservaci\u00f3n.<\/li>\n\n\n\n<li>Informaci\u00f3n que cambia cada pocos segundos.<\/li>\n\n\n\n<li>Datos cr\u00edticos de seguridad sin una estrategia clara de invalidaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En estos casos, mostrar informaci\u00f3n desactualizada podr\u00eda provocar errores funcionales o incluso afectar procesos importantes del sistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La importancia del tiempo de expiraci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las decisiones m\u00e1s importantes al trabajar con cach\u00e9 es definir cu\u00e1nto tiempo puede mantenerse vigente la informaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>now()-&gt;addMinutes(10);\nnow()-&gt;addHour();\nnow()-&gt;addHours(24);\nnow()-&gt;addDay();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No existe un tiempo universal. Depende de qu\u00e9 tan r\u00e1pido cambie el dato y cu\u00e1nto tiempo sea aceptable trabajar con una versi\u00f3n anterior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 pasa cuando el cach\u00e9 expira?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No necesitas crear un proceso adicional para actualizarlo. Cuando la entrada expira, la siguiente petici\u00f3n que ejecute <code>Cache::remember()<\/code> volver\u00e1 a ejecutar el callback, obtendr\u00e1 una versi\u00f3n nueva y la almacenar\u00e1 nuevamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n puedes eliminar manualmente una entrada:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cache::forget('iconify.collection.mdi');<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O limpiar todo el cach\u00e9 de la aplicaci\u00f3n mediante Artisan:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php artisan cache:clear<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este \u00faltimo comando debe utilizarse con cuidado porque elimina todas las entradas del store de cach\u00e9 utilizado por la aplicaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Una regla pr\u00e1ctica<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u00bfLa informaci\u00f3n se consulta muchas veces?\n        \u2193 s\u00ed\n\u00bfObtenerla es relativamente costoso?\n        \u2193 s\u00ed\n\u00bfPuede tolerar estar desactualizada algunos minutos u horas?\n        \u2193 s\u00ed\nCache::remember() es un buen candidato.<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Cache::remember()<\/code> 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\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave no est\u00e1 en almacenar todo en cach\u00e9, sino en identificar qu\u00e9 informaci\u00f3n se consulta constantemente, qu\u00e9 tan costoso es obtenerla y durante cu\u00e1nto tiempo puede mantenerse sin actualizarse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En Maria Tech desarrollamos soluciones de software a medida con Laravel y otras tecnolog\u00edas, buscando que cada sistema sea mantenible, eficiente y preparado para crecer conforme lo requiera el negocio.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/wa.me\/523414305984\" target=\"_blank\" rel=\"noreferrer noopener\">(+52) 341-430-59-84<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"mailto:info@mariatech.com.mx\" target=\"_blank\" rel=\"noreferrer noopener\">info@mariatech.com.mx<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Cuando una aplicaci\u00f3n consulta constantemente la misma informaci\u00f3n&#8230;<\/p>\n","protected":false},"author":1,"featured_media":325,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-324","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel-php"],"_links":{"self":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=324"}],"version-history":[{"count":0,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/324\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media\/325"}],"wp:attachment":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}