Español
Arquitectura
Caching con Redis

Caching con Redis

ReliaPulse utiliza Redis para cachear respuestas de API y mejorar el rendimiento bajo alta carga.

Resumen

Los endpoints públicos como la API de status page y los feeds RSS pueden recibir mucho tráfico, especialmente durante incidentes cuando los usuarios refrescan frecuentemente. El caching con Redis reduce la carga en la base de datos y mejora los tiempos de respuesta.

Configuración del Cache

Guía de TTL

EndpointTTLJustificación
ReliaPulse Público30 segundosVista frecuente, necesita datos frescos
Feeds Públicos (RSS/Atom/JSON)60 segundosFrescura menos crítica
Configuración de Organización5 minutosCambia raramente
Agregaciones de Componentes10 segundosFrescura moderada necesaria

Claves de Cache

// Datos del status page público
cache:public:status:{slug}
 
// Feeds públicos por formato
cache:public:feed:{slug}:rss
cache:public:feed:{slug}:atom
cache:public:feed:{slug}:json
 
// Configuración de organización
cache:org:settings:{organizationId}
 
// Agregaciones de componentes
cache:org:components:{organizationId}

Uso

Caching Básico

import { withCache, cacheKeys, cacheTTL } from "@/lib/cache";
 
// Envolver operaciones costosas con caching
const data = await withCache(
  cacheKeys.publicStatus(slug),
  cacheTTL.PUBLIC_STATUS,
  async () => {
    // Esto solo se ejecuta si hay cache miss
    return await fetchStatusData(slug);
  }
);

Operaciones Manuales de Cache

import { cacheGet, cacheSet, cacheDel } from "@/lib/cache";
 
// Obtener valor cacheado
const cached = await cacheGet<StatusData>(key);
 
// Guardar con TTL
await cacheSet(key, data, 30); // TTL de 30 segundos
 
// Eliminar entrada de cache
await cacheDel(key);

Invalidación de Cache

El cache se invalida automáticamente cuando los datos cambian:

import { invalidatePublicStatusCacheByOrgId } from "@/lib/cache";
 
// Llamar después de crear/actualizar/eliminar datos
// Esto es fire-and-forget (no bloquea la respuesta)
invalidatePublicStatusCacheByOrgId(organizationId).catch(console.error);

Invalidación Automática

Las siguientes acciones invalidan automáticamente el cache del status público:

  • Componentes: Crear, actualizar, eliminar, acciones masivas
  • Incidentes: Crear, actualizar, eliminar
  • Mantenimientos: Crear, actualizar, eliminar

Esto asegura que los usuarios vean datos frescos después de cambios mientras se benefician del caching durante períodos estables.

Caching HTTP

Además del caching Redis, la API establece headers de cache HTTP:

Cache-Control: public, max-age=30

Esto permite:

  • Caching del navegador para usuarios individuales
  • Caching en edge de CDN si se despliega detrás de un CDN
  • Invalidación correcta de cache mediante claves

Impacto en Rendimiento

Con caching habilitado:

MétricaSin CacheCon Cache
Tiempo de respuesta promedio50-200ms5-15ms
Consultas DB por request3-50 (en cache hit)
Requests antes de throttling~100/min~1000/min

Configuración

El caching usa la misma instancia de Redis que la cola de jobs. No se necesita configuración adicional más allá de establecer REDIS_URL:

REDIS_URL=redis://localhost:6379

Monitoreo

Monitorear rendimiento del cache via comandos Redis:

# Conectar a Redis
redis-cli
 
# Ver claves de cache
KEYS cache:*
 
# Verificar TTL de una clave
TTL cache:public:status:acme-corp
 
# Ver uso de memoria
INFO memory

Mejores Prácticas

  1. TTLs cortos para datos críticos: Usar 30 segundos o menos para datos de status
  2. Invalidación fire-and-forget: No bloquear respuestas API esperando limpieza de cache
  3. Degradación elegante: Si Redis no está disponible, bypass cache y consultar DB directamente
  4. Monitorear tasas de hit: Rastrear cache hits vs misses para optimizar TTLs