Casos de uso de Redis: Caché, Colas y Rate Limiting
Has construido una aplicación web que está ganando tracción, pero ahora cada carga de página golpea la base de datos, los trabajos en segundo plano se acumulan y algunos usuarios están saturando tu API. Necesitas un almacén de datos en memoria rápido para manejar estos desafíos. Redis es la solución ideal para caché, colas y rate limiting. En este artículo, exploraremos estos tres casos de uso principales con ejemplos prácticos y mejores prácticas.
¿Por qué Redis para Caché, Colas y Rate Limiting?
Redis es un almacén de clave-valor en memoria conocido por su velocidad y versatilidad. Admite estructuras de datos ricas como cadenas, listas, conjuntos, conjuntos ordenados y hashes, lo que lo hace ideal para diversas tareas. Sus operaciones atómicas y capacidades de pub/sub amplían aún más su utilidad. Ya sea que estés reduciendo la carga de la base de datos, desacoplando servicios o protegiendo APIs, Redis ofrece un conjunto de herramientas simple pero poderoso.
1. Caché con Redis
El caché es el caso de uso más común de Redis. Al almacenar datos de acceso frecuente en memoria, reduces la latencia y la carga de la base de datos. La característica TTL (tiempo de vida) de Redis expira automáticamente los datos obsoletos.
Cómo implementar el caché
- Verifica el caché: Antes de consultar la base de datos, verifica si los datos existen en Redis.
- En caso de fallo de caché: Obtén los datos de la base de datos y almacena el resultado en Redis con un tiempo de expiración.
- En caso de acierto de caché: Devuelve los datos almacenados en caché directamente.
Aquí tienes un ejemplo en Python usando redis-py:
import redis
import json
r = redis.Redis(host='localhost', port=6379, db=0)
def get_user(user_id):
cache_key = f"user:{user_id}"
cached = r.get(cache_key)
if cached:
return json.loads(cached)
# Simular obtención de DB
user = fetch_user_from_db(user_id)
r.setex(cache_key, 3600, json.dumps(user)) # Caché por 1 hora
return user
Mejores prácticas para el caché
- Establece TTLs apropiados: Equilibra la frescura y la tasa de aciertos. TTLs cortos para datos volátiles, más largos para contenido estático.
- Usa invalidación de caché: Cuando los datos cambien, elimina o actualiza la clave de caché para evitar lecturas obsoletas.
- Maneja estampidas de caché: Usa bloqueos o expiración temprana probabilística para evitar que muchas solicitudes golpeen la base de datos simultáneamente en caso de fallo de caché.
- Monitorea la tasa de aciertos: Apunta a una alta proporción de aciertos (por ejemplo, >80%) para asegurar que el caché sea efectivo.
2. Colas con Redis
Las listas y conjuntos ordenados de Redis permiten colas de mensajes simples pero robustas. Son perfectas para trabajos en segundo plano, colas de tareas y procesamiento de eventos. A diferencia de los brokers de mensajes dedicados, las colas de Redis son ligeras y fáciles de configurar.
Implementación de una cola básica
Usa LPUSH para agregar trabajos y BRPOP para consumirlos de manera bloqueante:
# Productor
r.lpush('job_queue', json.dumps({'task': 'send_email', 'to': 'user@example.com'}))
# Consumidor
while True:
_, job = r.brpop('job_queue', timeout=30)
if job:
process_job(json.loads(job))
Colas avanzadas con conjuntos ordenados
Para trabajos retrasados o colas de prioridad, usa conjuntos ordenados con marcas de tiempo como puntuaciones. Los consumidores obtienen trabajos con puntuaciones