Volver a Documentación
Redis

Redis

v7.x

Store en memoria: caché, sesiones y colas

Descripción

Redis es el componente crítico para autenticación stateful en WicSecure. Sin Redis, la blacklist de JWT no funciona y todos los endpoints autenticados devuelven 500. Cada app tiene su propio Redis aislado en el stack.

Uso en WicSecure

Redis se usa para: (1) Blacklist de JWTs revocados con TTL igual al tiempo restante del token, (2) Rate limiting distribuido con @nestjs/throttler, (3) Colas BullMQ para emails y procesamiento asíncrono. La URL interna es redis://<app>_redis:6379.

Configuración clave

typescriptconfig
# Stack YAML — Redis dedicado por app
services:
  redis:
    image: redis:7-alpine
    command: redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru
    networks: [app_net]
    volumes: [redis_data:/data]
    deploy:
      placement:
        constraints: [node.role == worker]

# En el .env-miapp
REDIS_URL=redis://miapp_redis:6379

# En el código NestJS
REDIS_URL=redis://miapp_redis:6379

Ejemplo de uso

typescript
// redis.service.ts — blacklist de JWT
@Injectable()
export class RedisService {
  private client: Redis

  constructor(private config: ConfigService) {
    this.client = new Redis(this.config.getOrThrow('REDIS_URL'))
  }

  async blacklistToken(jti: string, exp: number): Promise<void> {
    const ttl = exp - Math.floor(Date.now() / 1000)
    if (ttl > 0) await this.client.setex(`bl:${jti}`, ttl, '1')
  }

  async isBlacklisted(jti: string): Promise<boolean> {
    return (await this.client.exists(`bl:${jti}`)) === 1
  }

  async set(key: string, value: string, ttl?: number): Promise<void> {
    ttl ? await this.client.setex(key, ttl, value)
         : await this.client.set(key, value)
  }
}

Características clave

  • Latencia < 1ms para lectura/escritura en memoria
  • TTL nativo para expiración automática de claves
  • Pub/Sub y Streams para mensajería en tiempo real
  • Persistencia AOF/RDB opcional
  • Cluster mode para escalado horizontal