Concepto clave
Redis en produccion es mas que una simple base de datos en memoria: es un sistema de infraestructura critica que optimiza el rendimiento del backend mediante tres patrones fundamentales. Imagina un restaurante de alta demanda: el cache seria como tener los platos mas pedidos pre-preparados para servir al instante, las sesiones serian como reconocer a los clientes habituales y recordar sus preferencias, y las colas serian como el sistema de tickets de cocina que organiza los pedidos en orden de prioridad.
La clave esta en entender que Redis no es un almacenamiento permanente, sino un acelerador de rendimiento. Cuando implementas cache, estas reduciendo la carga en tu base de datos principal. Las sesiones distribuídas permiten que los usuarios mantengan su estado sin importar que servidor backend atienda su solicitud. Las colas de trabajos desacoplan procesos pesados para que no bloqueen las respuestas inmediatas al usuario.
Como funciona en la practica
Vamos a implementar un sistema de recomendaciones para un e-commerce. Primero, configuramos cache para productos populares:
# Python con redis-py
import redis
import json
r = redis.Redis(host='produccion-redis.empresa.com', port=6379, password='secreto')
def obtener_producto(producto_id):
# 1. Intentar obtener del cache
cache_key = f"producto:{producto_id}"
producto_cache = r.get(cache_key)
if producto_cache:
return json.loads(producto_cache)
# 2. Si no esta en cache, consultar base de datos
producto_db = consultar_base_de_datos(producto_id)
# 3. Almacenar en cache por 5 minutos
r.setex(cache_key, 300, json.dumps(producto_db))
return producto_dbPara sesiones, usamos Redis como almacenamiento distribuído:
# Configuracion de sesiones en Node.js con Express
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
app.use(session({
store: new RedisStore({
host: 'produccion-redis.empresa.com',
port: 6379,
pass: 'secreto'
}),
secret: 'clave-secreta-sesion',
resave: false,
saveUninitialized: false,
cookie: { secure: true, maxAge: 86400000 } // 24 horas
}));Para colas de trabajos, procesamos envio de emails asincronamente:
# Productor de trabajos en Python
import redis
from rq import Queue
r = redis.Redis(host='produccion-redis.empresa.com', port=6379, password='secreto')
q = Queue('emails', connection=r)
# Encolar trabajo sin bloquear respuesta
job = q.enqueue('modulo_envios.enviar_email',
destinatario='[email protected]',
plantilla='bienvenida',
datos={'nombre': 'Juan'},
result_ttl=86400) # Resultado valido por 24 horasCaso de estudio
Plataforma de streaming con 1M usuarios concurrentes
Problema inicial: La base de datos principal colapsaba durante picos de trafico cuando muchos usuarios accedian simultaneamente al catalogo de peliculas.
Solucion implementada:
- Cache de dos niveles: Redis para cache caliente (ultimas 24 horas) + CDN para contenido estatico
- Sesiones distribuidas: Usuarios mantienen su lista de reproduccion y preferencias sin importar el servidor
- Cola de procesamiento de videos: Conversiones de calidad se encolan en Redis para procesamiento asincrono
Resultados medidos:
| Metrica | Antes | Despues |
|---|---|---|
| Latencia promedio | 450ms | 85ms |
| Picos de CPU en BD | 95% | 35% |
| Disponibilidad | 99.2% | 99.95% |
| Costo infraestructura | $15,000/mes | $8,500/mes |
El cache adecuado redujo la carga de la base de datos en un 63%, permitiendo escalar horizontalmente sin aumentar costos proporcionalmente.
Errores comunes
- Cache sin estrategia de invalidacion: Datos desactualizados causan inconsistencias. Solucion: Implementar TTL adecuado y invalidacion por eventos.
- Sesiones sin encriptacion: Informacion sensible expuesta. Solucion: Usar conexiones TLS y almacenar solo identificadores, no datos sensibles.
- Colas sin monitoreo: Trabajos fallidos se acumulan silenciosamente. Solucion: Implementar dead letter queues y alertas.
- Falta de replicacion: Single point of failure. Solucion: Configurar Redis Sentinel o Cluster para alta disponibilidad.
- TTL demasiado corto o largo: Cache inefectivo o datos obsoletos. Solucion: Analizar patrones de acceso y ajustar dinamicamente.
Checklist de dominio
- Puedo configurar Redis con autenticacion y conexiones seguras en ambiente de produccion
- Implemento estrategias de cache con TTL y invalidacion basada en eventos
- Uso Redis para sesiones distribuidas en una arquitectura de microservicios
- Diseno colas de trabajos con prioridades y manejo de fallos
- Configuro replicacion y monitoreo para alta disponibilidad
- Optimizo el uso de memoria con configuraciones adecuadas de maxmemory
- Implemento backup y recovery procedures para datos criticos
Implementacion de Sistema de Notificaciones con Redis Pub/Sub y Colas
Objetivo
Crear un sistema que procese notificaciones en tiempo real usando Redis Pub/Sub para eventos inmediatos y colas para procesamiento batch.
Pasos
- Configura una instancia de Redis local o en contenedor Docker con persistencia habilitada
- Crea un publicador (publisher.py) que envie eventos a un canal llamado "notificaciones" cuando ocurran estas acciones:
- Usuario nuevo se registra
- Pedido es completado
- Producto baja de precio
- Implementa un suscriptor (subscriber.py) que escuche el canal "notificaciones" y:
- Para eventos criticos (ej: fallo de sistema), envie notificacion inmediata
- Para eventos no criticos, los encole en una lista llamada "notificaciones_pendientes"
- Crea un worker (worker.py) que procese la cola "notificaciones_pendientes" cada 30 segundos
- Implementa monitoreo basico que muestre:
- Cantidad de eventos publicados por tipo
- Tiempo promedio en cola
- Eventos fallidos (dead letter queue)
- Prueba el sistema simulando 100 eventos de diferentes tipos y verifica que:
- Los eventos criticos se procesen inmediatamente
- Los eventos no criticos se procesen en batch
- No haya perdida de eventos
Entregables
- Codigo fuente de los tres componentes (publisher, subscriber, worker)
- Script de prueba que simula la carga
- Documentacion de configuracion Redis
- Metricas de rendimiento capturadas
- Usa redis-py para Python o la libreria equivalente en tu lenguaje preferido
- Considera usar diferentes estructuras de datos de Redis para diferentes necesidades: pub/sub para tiempo real, listas para colas simples
- Implementa logging detallado para debuggear el flujo de eventos
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.