Redis
v7.xStore 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:6379Ejemplo 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