PureTools

Estrategias de Caché: Browser, CDN y Server-Side

PureTools Team· 8 min de lectura
Estrategias de Caché: Browser, CDN y Server-Side

Caching: El Código Más Rápido Es el que No Corre

Caching es la optimización de rendimiento más impactante. Una respuesta servida del caché es 10-1000x más rápida que una generada desde cero. Pero caching introduce complejidad: datos stale, invalidación y problemas de consistencia.

Las Capas de Caché

Usuario → Caché Browser → CDN Edge → Caché Servidor (Redis) → App → BD
            ~0ms            ~20ms         ~1ms                ~50ms   ~100ms

Caché del Browser (Cache-Control)

Cache-Control: public, max-age=3600                    # 1 hora
Cache-Control: public, max-age=31536000, immutable      # 1 año (assets con hash)
Cache-Control: no-store                                  # nunca cachear
Cache-Control: no-cache                                  # cachea pero siempre revalida
DirectivaSignificado
publicCualquier caché puede almacenar
privateSolo el browser puede cachear
max-age=NCachear por N segundos
s-maxage=NDuración del caché CDN
stale-while-revalidate=NServir stale por N segundos mientras busca nueva versión
immutableContenido nunca cambia

Qué Cachear Dónde

ContenidoEstrategiaCache-Control
Assets estáticosCaché largo + hash en nombrepublic, max-age=31536000, immutable
HTML estáticoCDN con revalidaciónpublic, s-maxage=3600, stale-while-revalidate=600
Respuestas API públicasCaché CDN cortopublic, s-maxage=60
Respuestas específicas del userPrivate o no-storeprivate, no-cache

Caché Server-Side (Redis)

async function getProduct(id) {
  const cached = await redis.get(`product:${id}`);
  if (cached) return JSON.parse(cached);
  
  const product = await db.products.findById(id);
  await redis.set(`product:${id}`, JSON.stringify(product), 'EX', 300);
  return product;
}

async function updateProduct(id, data) {
  await db.products.update(id, data);
  await redis.del(`product:${id}`); // invalida el caché
}

Invalidación de Caché (La Parte Difícil)

  • Basada en TTL: Caché expira después de N segundos.
  • Basada en eventos: Invalidar cuando datos cambian.
  • Claves versionadas: product:42:v3.
  • Stale-while-revalidate: Sirve stale inmediatamente, actualiza en background.