Python e Redis: Utilizando Pub/Sub

Acredito que você já tenha ouvido falar sobre o conceito de publisher/subscriber, certo? E você sabia que o Redis possui essa comunicação nativamente?

De maneira muito sucinta, vou mostar um exemplo prático e simples utilizando Redis e Python usando a comunicação publish/subscriber.

O que preciso?

Para esse exemplo são necessárias três ferramentas instaladas na sua máquina:

  • Python 3.8 ou superior
  • pip
  • Redis

Os detalhes de instalação vou pular porque esse exemplo pode ser feito em qualquer SO. Basta seguir a documentação de instalação de cada item.

Por fim, uma vez instalado o pip, vamos instalar o redis (ah, para quem não sabe, o pip seria o npm do python) com o comando abaixo:

pip3 install redis

O Script

Crie um arquivo chamado app.py e cole esse script:

from redis import StrictRedis
from time import strftime, sleep

client = StrictRedis(host="localhost", port=6379)

subscriber = client.pubsub()
subscriber.psubscribe('channel_test')

while True:
    messages = subscriber.get_message()
    now = strftime('%d/%m/%Y:%H:%M:%S')

    if messages:
        print(f'{now} - {messages["data"]}')
    else:
        print(f'{now} - Nothing here!!!')
    sleep(1)

Explicando cada linha

Importação do redis para o projeto (obviously) , importação de formatação de data da classe time e também o sleep, que vai fazer com que nosso while sofra uma pausa de 1 segundo em cada iteração.

from redis import StrictRedis
from time import strftime, sleep

Conexão com o redis

client = StrictRedis(host="localhost", port=6379)

Especificando que vamos nos subscrever num canal chamado channel_test

subscriber = client.pubsub()
subscriber.psubscribe('channel_test')

Bloco while que vai ficar rodano sem parar o processo de subscribe. Uma vez que seja publicada alguma mensagem no canal channel_test, vai ser printado no console.

while True:
    messages = subscriber.get_message()
    now = strftime('%d/%m/%Y:%H:%M:%S')

    if messages:
        print(f'{now} - {messages["data"]}')
    else:
        print(f'{now} - Nothing here!!!')
    sleep(1)

Publicando no canal

Redis instalado? Tá na hora de usar esse carinha.
No terminal/prompt, rode o comando:

redis-cli

Se tudo tiver ocorrido bem na instalação e o redis estiver rodando, você deve estar com o shell do redis habilitado.

Para publicar, basta digitar:

publish channel_test "um conteúdo qualquer aqui"

Ah, a gente ainda não executou nosso script python. Pelo terminal, acesse o diretório de onde está nosso app.py e execute com o comando:

python app.py

Resultado

Script rodando? Redis rodando? Publish realizado?
Pah, a mágica acontece ...

Agora exercite sua criatividade e implemente outras coisas bacanas usando redis como publisher/subscriber e seja feliz =D =D =D

20