Cache y expiraciones
Redis se usa mucho como cache porque responde muy rapido y permite expiraciones por clave.
Cache-aside
Patron habitual:
txt
leer cache
si existe -> devolver
si no existe -> leer base de datos -> guardar en Redis con TTL -> devolverPseudo codigo:
txt
key = "producto:1"
valor = redis.get(key)
if valor == null:
valor = db.query(...)
redis.set(key, valor, ex=300)
return valorTTL
bash
SET producto:1 "{...}" EX 300
TTL producto:1
EXPIRE producto:1 600
PERSIST producto:1Invalidacion
Estrategias:
- Expirar por tiempo.
- Borrar cache al actualizar dato.
- Versionar claves.
- Usar eventos para invalidar.
Ejemplo:
bash
DEL producto:1Stampede
Ocurre cuando muchas peticiones recalculan la misma clave al expirar.
Mitigaciones:
- TTL con variacion aleatoria.
- Locks temporales.
- Refresco anticipado.
- Cache de valores stale durante poco tiempo.
Eviction
Si Redis llega al limite de memoria, aplica una politica:
noevictionallkeys-lruvolatile-lruallkeys-lfuvolatile-ttl
Elige segun si Redis es cache pura o contiene datos que no deben perderse.
Buenas practicas
- Define TTL por tipo de dato.
- Usa claves predecibles.
- No caches datos que cambian constantemente sin invalidacion.
- Serializa de forma compacta.
- Monitoriza hit rate y memoria.
Errores comunes
- Cachear sin TTL.
- No invalidar despues de escrituras.
- Usar Redis como solucion a consultas mal disenadas.
- Guardar respuestas enormes.
- No definir politica de eviction.
