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
| Endpoint | TTL | Justificación |
|---|---|---|
| ReliaPulse Público | 30 segundos | Vista frecuente, necesita datos frescos |
| Feeds Públicos (RSS/Atom/JSON) | 60 segundos | Frescura menos crítica |
| Configuración de Organización | 5 minutos | Cambia raramente |
| Agregaciones de Componentes | 10 segundos | Frescura 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=30Esto 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étrica | Sin Cache | Con Cache |
|---|---|---|
| Tiempo de respuesta promedio | 50-200ms | 5-15ms |
| Consultas DB por request | 3-5 | 0 (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:6379Monitoreo
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 memoryMejores Prácticas
- TTLs cortos para datos críticos: Usar 30 segundos o menos para datos de status
- Invalidación fire-and-forget: No bloquear respuestas API esperando limpieza de cache
- Degradación elegante: Si Redis no está disponible, bypass cache y consultar DB directamente
- Monitorear tasas de hit: Rastrear cache hits vs misses para optimizar TTLs