¿Cuándo NO deberías recurrir a una caché? ¿Cuáles son los riesgos reales de cachear en exceso?
El cacheo suele venderse como una mejora de rendimiento gratuita, pero cada caché que agregas es una segunda fuente de verdad, un nuevo modo de fallo y una apuesta a que la obsolescencia sale más barata que la consulta que estás evitando.
APRENDE HACIENDOPon a prueba tu intuición3 pasos
¿Cuándo NO deberías recurrir a una caché? ¿Cuáles son los riesgos reales de cachear en exceso?
Usa los ejemplos y la explicación de la lección para comprobar tu idea.
Reflexión personal. No se envía a ningún servicio de IA.#Cachear es una apuesta, no una ganancia gratuita
Toda caché es una apuesta: que servir datos ligeramente obsoletos y duplicados sale más barato que calcular u obtener la versión fresca cada vez. Esa apuesta suele ser correcta, pero sigue siendo una apuesta, y esta pregunta se hace en entrevistas específicamente para ver si el candidato trata el cacheo como un reflejo por defecto o como una decisión deliberada con costos reales del otro lado de la balanza. La respuesta honesta a "¿debería cachear esto?" es "no automáticamente", y saber cuándo decir que no es una habilidad tan senior como saber construir la caché en primer lugar.
#Los riesgos reales de cachear en exceso
Los datos obsoletos se convierten en un bug de corrección, no solo en una molestia de UX. Una descripción de producto con cinco segundos de antigüedad es inofensiva. Un saldo de cuenta con cinco segundos de antigüedad que permite que se apruebe un retiro contra fondos que ya se gastaron en otro lado es un incidente financiero. Los conteos de inventario durante el checkout, las verificaciones de permisos/roles, los feature flags que controlan un interruptor de apagado, y cualquier cosa que alimente un libro contable son lugares donde "eventualmente consistente" es el modelo de consistencia equivocado, y una caché convierte silenciosamente tu sistema de fuertemente consistente a eventualmente consistente sin que nadie haya tomado esa decisión a propósito.
Depurar se vuelve más difícil, no más fácil. Una caché agrega una segunda fuente de verdad que puede estar en desacuerdo con la primera, y esos desacuerdos son, por construcción, invisibles en el camino normal de la solicitud — la solicitud sigue devolviendo 200 OK, solo que con el cuerpo equivocado. "Funciona después de reiniciar el servicio" y "funciona bien en staging pero mal en producción" son ambos síntomas clásicos de una caché desincronizada con la base de datos, y ninguno aparece en un stack trace. Cada caché que agregas es también una capa de indirección que un futuro ingeniero tiene que aprender antes de poder confiar en lo que realmente devuelve una función.
Con frecuencia es optimización prematura. Cachear una consulta que ya se ejecuta en dos milisegundos porque está respaldada por un índice adecuado no hace que el sistema sea más rápido de ninguna forma que un usuario pueda percibir — solo agrega un componente nuevo que correr, monitorear y eventualmente depurar, a cambio de recortar una latencia que nadie iba a notar. El orden correcto es: medir la latencia real y el volumen de llamadas de la operación, confirmar que en efecto es un cuello de botella, y solo entonces recurrir a una caché — no al revés.
Una caché puede ocultar un bug en vez de arreglarlo. Una página que es lenta porque dispara 200 consultas sin agrupar por solicitud (un clásico N+1) efectivamente se volverá más rápida si cacheas su salida — pero cacheaste el síntoma. El patrón de consulta subyacente sigue siendo malo, va a reaparecer en cuanto la caché esté fría o se invalide, y ahora hay dos problemas que arreglar en vez de uno.
La superficie operativa crece. Una caché es infraestructura: algo que hay que aprovisionar, escalar, asegurar y mantener disponible. Cuando se cae, no solo pierdes la mejora de velocidad — puedes sufrir una "estampida de caché" (también llamada thundering herd o dog-piling), donde cada solicitud que antes golpeaba la caché ahora golpea la base de datos al mismo tiempo, a un volumen para el que la base de datos nunca fue dimensionada, convirtiendo una caída de caché en una caída de base de datos.
La complejidad de invalidación se acumula. Cada consulta adicional que se cachea es una entrada más en el mapa de invalidación: un conjunto más de caminos de escritura que ahora tienen que recordar romper las claves correctas. Esto crece más rápido que linealmente, porque las escrituras rara vez afectan a una sola consulta cacheada — y un camino de invalidación que se olvidó es un bug que solo se manifiesta como "a veces el dato está mal", una de las categorías de bug más difíciles de reproducir y arreglar.
#Cuándo NO recurrir a una caché
| Situación | Por qué cachear perjudica más de lo que ayuda |
|---|---|
| Se requiere consistencia estricta (saldos, inventario en checkout, decisiones de autenticación) | Aquí la obsolescencia no es un intercambio de rendimiento, es una violación de corrección |
| El dato se lee una vez o rara vez (un reporte puntual, un cómputo por sesión) | La tasa de aciertos se mantiene cerca de cero, así que la caché agrega overhead sin llegar nunca a recuperarlo |
| La operación subyacente ya es rápida | No hay latencia que recuperar; la caché es pura complejidad añadida |
| La proporción escritura:lectura es alta | Vas a invalidar casi tan seguido como consultarías de otro modo — sin ganancia neta |
| No puedes articular una regla clara de invalidación | Si no puedes decir qué rompe la caché, vas a lanzar un bug de datos obsoletos, no una optimización |
| El problema real es un índice faltante o una consulta mal formada | Cachear oculta el síntoma y deja que el defecto real llegue a producción |
#Una mitigación más ligera que vale la pena conocer
Incluso cuando cachear es la decisión correcta, el exceso de cacheo se cuela a través de las propias mitigaciones si se aplican en todas partes por defecto. Técnicas como la coalescencia de solicitudes (solo una solicitud por clave puede ir a calcular el valor mientras las demás esperan) o el stale-while-revalidate (servir el valor viejo de inmediato mientras se refresca en segundo plano) existen específicamente para combatir estampidas de caché y ventanas de obsolescencia — pero recurrir a ellas en cada caché, en lugar de solo en las que de verdad ven contención o requisitos estrictos de consistencia, es el mismo error de optimización prematura, un nivel más arriba.
🧠 Check your understanding
0/2 · 0/2 answered1. Se agrega una caché delante de un reporte que dos usuarios internos consultan aproximadamente una vez por semana. ¿Cuál es el resultado más probable?
2. ¿Cuál de estos es el argumento más fuerte para NO cachear un valor?