Command Palette

Search for a command to run...

ES·EN

Nivel 2 · 20 min

Pub/Sub en Redis

Redis Pub/Sub implementa el patrón publicador/suscriptor — los publicadores envían mensajes a canales y los suscriptores los reciben sin conocerse mutuamente. Es un mecanismo de mensajería en tiempo real, ligero y sin persistencia, integrado directamente en Redis.

Canales y comandos básicos

SUBSCRIBE canal suscribe a un canal. PUBLISH canal mensaje envía a todos los suscriptores del canal. PSUBSCRIBE patron* suscribe con wildcards (útil para suscribirse a múltiples canales por prefijo). Una conexión en modo SUBSCRIBE solo puede usar SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE y PING — no puede ejecutar otros comandos. Necesitás una conexión separada para publicar.

El patrón Pub/Sub y sus limitaciones

Pub/Sub desacopla publicadores de suscriptores — el publicador no sabe quién escucha, ni cuántos. Limitaciones críticas: fire-and-forget — los mensajes no se persisten. Si no hay suscriptores activos, el mensaje se pierde. Si un suscriptor se desconecta y reconecta, perdió todos los mensajes del intervalo. No hay garantía de entrega — Pub/Sub es at-most-once. Para mensajería confiable con persistencia, usá Redis Streams.

Keyspace notifications

Redis puede notificar eventos sobre operaciones en las claves — expiración, modificación, eliminación. Se configura con notify-keyspace-events. Por ejemplo: K (keyspace events), E (keyevent events), x (expiración), g (comandos genéricos). Útil para reaccionar a TTL expirado sin polling. SUBSCRIBE __keyevent@0__:expired recibe notificación cada vez que expira una clave en DB 0.

Puntos clave

  • Pub/Sub de Redis es at-most-once — no persiste mensajes. Si necesitás at-least-once, usá Redis Streams.
  • Los keyspace notifications permiten reaccionar a eventos de Redis (expiración, modificación) sin polling activo.
  • Una conexión en modo SUBSCRIBE es dedicada — necesitás otra conexión para publicar o hacer otras operaciones.

Code example

// Publicar (conexion normal)
redis.publish("notifications:user:123", JSON.stringify(payload));

// Suscribir (conexion dedicada)
subClient.subscribe("notifications:user:123", (message) => {
  const data = JSON.parse(message);
  sendWebSocketPush(data);
});

// Con patron (wildcard)
subClient.psubscribe("notifications:user:*", handleNotification);