Redis Cache Stampede: Como Prevenir com Bloqueio e Jitter de TTL

Aprenda como um aumento repentino de solicitações para uma chave de cache expirada pode sobrecarregar seu banco de dados e como impedir isso usando bloqueios mutex, recomputação probabilística antecipada e jitter de TTL no Redis.

Redis Cache Stampede: Como Prevenir com Bloqueio e Jitter de TTL

O que é Cache Stampede?

Cache stampede (ou avalanche de cache) ocorre quando uma chave de cache popular expira e múltiplas requisições simultâneas tentam regenerar o cache ao mesmo tempo, sobrecarregando o banco de dados ou serviço de backend.

Estratégias de Prevenção

1. Bloqueio Mutex (Mutex Lock)

Use um bloqueio distribuído para garantir que apenas um processo recalcule o cache:

import redis
import time

r = redis.Redis()

def get_data(key):
    # Tenta obter do cache
    data = r.get(key)
    if data is not None:
        return data
    
    # Tenta adquirir bloqueio
    lock_key = f"lock:{key}"
    if r.setnx(lock_key, "locked"):
        # Define expiração do bloqueio
        r.expire(lock_key, 10)
        try:
            # Recalcula dados
            data = expensive_computation()
            r.setex(key, 300, data)
            return data
        finally:
            r.delete(lock_key)
    else:
        # Espera e tenta novamente
        time.sleep(0.1)
        return get_data(key)

2. Recomputação Probabilística Antecipada

Recalcula o cache antes da expiração com base em probabilidade:

import random

def should_recompute(ttl, beta=1.0):
    """Decide probabilisticamente se deve recomputar"""
    return random.random() < (1 - ttl / (beta * 300))

3. Jitter de TTL

Adicione variação aleatória ao TTL para evitar expirações simultâneas:

import random

base_ttl = 300
jitter = random.uniform(0.9, 1.1)  # ±10%
ttl = int(base_ttl * jitter)
r.setex(key, ttl, data)

Comparação de Estratégias

Estratégia Complexidade Eficácia Latência
Mutex Lock Média Alta Média
Recomputação Probabilística Baixa Média Baixa
Jitter de TTL Muito Baixa Alta Nenhuma

Conclusão

Combine múltiplas estratégias para máxima proteção. Use jitter de TTL como prevenção básica e mutex lock para dados críticos.