Pub/Sub do Redis

Pub/Sub é um padrão de comunicação de mensagens. Esta lição aborda a funcionalidade de publicação/assinatura do Redis.

O que é Pub/Sub?

O padrão Pub/Sub consiste em:

Publisher → Channel → Subscriber 1
                    → Subscriber 2
                    → Subscriber 3

Comandos Básicos

SUBSCRIBE: Assinar um Canal

REDIS
# Assinar um único canal
SUBSCRIBE canal1

# Assinar múltiplos canais
SUBSCRIBE canal1 canal2 canal3

Após assinar, o cliente entra em um estado de espera para receber mensagens.

PUBLISH: Publicar uma Mensagem

REDIS
# Publicar uma mensagem em um canal
PUBLISH canal1 "Olá, Redis!"
(integer) 2  # Retorna o número de assinantes que receberam a mensagem

UNSUBSCRIBE: Cancelar Assinatura

REDIS
# Cancelar assinatura de todos os canais
UNSUBSCRIBE

# Cancelar assinatura de um canal específico
UNSUBSCRIBE canal1

Assinatura por Padrão

PSUBSCRIBE: Assinatura por Correspondência de Padrão

REDIS
# Assinar canais que correspondem a um padrão
PSUBSCRIBE news.*  # Assinar todos os canais começando com news.

# Exemplo
PSUBSCRIBE user:*:notifications  # Assinar todos os canais de notificação de usuário

PUNSUBSCRIBE: Cancelar Assinatura por Padrão

REDIS
# Cancelar todas as assinaturas por padrão
PUNSUBSCRIBE

# Cancelar uma assinatura de padrão específica
PUNSUBSCRIBE news.*

Casos de Uso

1. Envio de Mensagens em Tempo Real

Exemplo: Notificações em Tempo Real

BASH
# Terminal 1: assinar notificações
SUBSCRIBE notifications

# Terminal 2: publicar uma notificação
PUBLISH notifications "Novo usuário registrado"
▶ Experimente

2. Sala de Bate-papo

Exemplo: Sala de Bate-papo

BASH
# Usuário 1: assinar sala de bate-papo
SUBSCRIBE chatroom:general

# Usuário 2: enviar uma mensagem
PUBLISH chatroom:general "Olá pessoal!"
▶ Experimente

3. Notificações do Sistema

Exemplo: Alertas do Sistema

BASH
# Administrador: assinar alertas do sistema
SUBSCRIBE system:alerts

# Sistema: enviar um alerta
PUBLISH system:alerts "Alto uso de CPU detectado"
▶ Experimente

Formato da Mensagem

Formato da mensagem recebida pelos assinantes:

TEXT
1) "message"           # Tipo de mensagem
2) "canal1"            # Nome do canal
3) "Olá, Redis!"       # Conteúdo da mensagem

Formato da mensagem de assinatura por padrão:

TEXT
1) "pmessage"          # Tipo de mensagem
2) "news.*"            # Padrão assinado
3) "news:sports"       # Nome real do canal
4) "Resultado do jogo!" # Conteúdo da mensagem

Notas Importantes

⚠️ Mensagens não são persistidas: Mensagens Pub/Sub não são armazenadas. Assinantes só recebem mensagens enviadas após eles assinarem.

⚠️ Perda de mensagens: Se um assinante desconectar, as mensagens enviadas durante esse período são perdidas.

💡 Alternativa: Quando a persistência de mensagens é necessária, use Redis Streams ou Lists para filas de mensagens.

Redis Stream (Recomendado)

Introduzido no Redis 5.0, Streams são uma solução de fila de mensagens melhor:

REDIS
# Adicionar uma mensagem
XADD mystream * name "Alice" action "login"
"1638361451780-0"

# Ler mensagens
XREAD COUNT 1 STREAMS mystream 0

# Grupos de consumidores
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >

Stream vs Pub/Sub

Recurso Pub/Sub Stream
Persistência de mensagens ❌ Não persistidas ✅ Persistidas
Confirmação de mensagens ❌ Sem ACK ✅ ACK suportado
Grupos de consumidores ❌ Não suportado ✅ Suportado
Mensagens históricas ❌ Não pode recuperar ✅ Consultável
Caso de uso Notificações em tempo real Filas de mensagens

❓ Perguntas Frequentes

P As mensagens Pub/Sub são armazenadas?
R Não. Pub/Sub é "fire and forget" — as mensagens não são persistidas.
P Um assinante desconectado pode receber mensagens históricas?
R Não. Use Streams ou Lists para persistência de mensagens.
P Quantos assinantes um canal pode ter?
R Teoricamente ilimitado — depende do desempenho do servidor.

📖 Resumo

📝 Atividades

  1. Prática de assinatura: Use dois terminais — um assina, o outro publica
  2. Assinatura por padrão: Use PSUBSCRIBE para assinar múltiplos canais correspondentes
  3. Prática de Stream: Use XADD/XREAD para implementar uma fila de mensagens simples

Próxima Lição

Na próxima lição, nós aprenderemos sobre Transações do Redis, abordando uso e cuidados com transações.

100%