sábado, 28 de janeiro de 2023

Como criar uma aplicação em Python que escreva e consulte um banco Redis.

No mundo da programação web, é muito comum observar aplicações que fazem leitura e escrita no Redis. O Redis é um banco de dados, do tipo chave/valor, com armazenamento em memória volatil(ram), ou seja, não faz escrita no disco. Portanto é uma excelente opção para escritas que precisam de velocidade, tanto de escrita quanto de consulta.

Para o teste, criei o seguinte arquivo docker-compose, com um container em redis e um container para rodar um worker em python.

para isso, precisamos instalar o modulo redis, no python.

Nota: Crie um virtual env, e dentro dele instale os modulos do redis. Dai crie um arquivo, to tipo freeze, para instala-lo em seu container sempre que for buildar.

$pip install redis
Para que isso seja impl

$pip freeze > requiriments.txt

Abaixo minha arvore de diretórios, para fins didaticos:
├── Dockerfile
├── app
│ ├── requirements.txt
│ └── worker.py
├── config
├── docker-compose.yaml
├── requirements.txt

Segue o código para o worker:

import time
from datetime import datetime
import redis
import os



def start():
ctime = datetime.now()
ts = int(round(ctime.timestamp()))
# Criando uma conexão com o banco Redis
print('Iniciando inserção de dados no redis')
REDIS_MASTER_NAME = os.environ.get('REDIS_MASTER_NAME')
REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD')
REDIS_ENDPOINTS = os.environ.get('REDIS_ENDPOINTS')

print(type(ts))
r = redis.Redis(host=REDIS_ENDPOINTS, port=6379, db=0)
r.set(ts,'Rodrigo,{}'.format(ts))

if __name__ == "__main__":
while True:
start()
time.sleep(1)

arquivo .env

REDIS_MASTER_NAME=redis
REDIS_PASSWORD=mypass
REDIS_ENDPOINTS=redis

Segue o docker-file:

version: '3'
services:
worker:
image: worker:1
command: ["python", "/opt/app/worker.py"]
env_file:
- config/.env
links:
- redis
redis:
image: redis
ports:
- "26379:26379"
environment:
- MASTER_NAME=mymaster
- MASTER_PASSWORD=mypass
- REQUIRE_PASS=mypass

$docker build . -t worker:1
$docker-compose up
Entre no redis, para verificar a inserção das chaves, la dentro use o comando keys *:
$docker exec -it poc-redis_redis_1 redis-cli

127.0.0.1:6379> keys *
4182) "1674941584"
4183) "1674940348"
127.0.0.1:6379> get 1674940348
"Rodrigo,1674940348"
127.0.0.1:6379>

Prontinho, seu redis está pronto para uso. Lembre-se que eleprecisa de uma função para deletar as chaves, ou então todos os dados ficarão permanentes na memória até o pod ser desligado.

Para isso(limpar tudo) use o comando Flushall:

127.0.0.1:6379> FLUSHALL

Geralmente, em uso pratico, deve-se limpar o redis depois que se remove o dado para um local em armazenamento fixo, como um mysql. Ou seja, coletou uma chave e enviou para o mysql, deleta a chave. Isso vai garantir um que seu sistema tenha um uso pratico com custos menores. Posteriormente, criarei um container de consumo, um mysql-consumer com essa função.


==========================================================================

Módulos:redis, python 3.6.15
Git: [link]

Nenhum comentário:

Postar um comentário