DEV Community

Cover image for Performance no REDIS com Pipelining
Jilcimar Fernandes
Jilcimar Fernandes

Posted on

Performance no REDIS com Pipelining

O que é o Redis Pipelining?

É uma técnica para melhorar o desempenho que permite enviar vários comandos de uma só vez sem esperar pela resposta de cada comando individual.

Fonte: https://redis.io/docs/manual/pipelining/

Através dessa imagem é possível ver a diferença que o pipelining faz na execução:

Performance do Redis com e sem o Pipelining

Fonte: https://kn100.me/redis-pipelining/

Quando ele é útil?

O Pipeline é muito útil em situações em que há muitas operações de leitura/escrita no Redis. Ao usar um pipeline, é possível reduzir significativamente o custo de latência associado ao tempo de ida e volta, além disso, ele melhora muito o número de operações que você pode executar por segundo.

Outro uso interessante para o Pipeline, é para implementar transações atômicas, garantindo que um conjunto de operações seja executado como uma única unidade. Isso é possível porque o Redis Pipeline permite que os comandos sejam agrupados em uma transação que só será executada quando todos os comandos no pipeline forem enviados e retornarem com sucesso.

Caso de uso

No trabalho, passei por uma situação a qual precisava melhorar a performance de uma Lambda (Python) que consumia de uma fila SQS e em seguida realizava várias operações de leitura e escrita no REDIS.

PROBLEMA
Devido a quantidade de operações realizadas a cada mensagem recebida, algumas acabavam não sendo processadas devido o timeout de 30 segundos configurado na lambda.
Gráfico de duração da Lambda
Gráfico de duração da execução (em milissegundos) da lambda antes de aplicar as técnicas de performance, chegando a picos de 27 segundos de duração:

A fila a qual a lambda consumia as mensagens, recebia cargas com até 2.500 mensagens para processar:

Dados da fila

RESULTADOS APÓS PERFORMANCE

Após aplicar o Redis pipelining, alguns dos resultados que obtivemos na Lambda:

Desempenho da Lambda

O maior pico de duração foi de 12,6 segundos.

Conclusão

O resultado foi bem positivo, tendo em vista que na maioria dos casos chegaram a reduzir pela metade o tempo de duração, além disto, em cenários de processamento com o mesmo número de mensagem não tivemos mais nenhum caso de timeout.

Após o uso do Redis Pipelining, também foram feitas algumas refatorações e mudanças na forma de processar a mensagem para melhorar ainda mais o tempo de execução da lambda.

API Trace View

How I Cut 22.3 Seconds Off an API Call with Sentry 👀

Struggling with slow API calls? Dan Mindru walks through how he used Sentry's new Trace View feature to shave off 22.3 seconds from an API call.

Get a practical walkthrough of how to identify bottlenecks, split tasks into multiple parallel tasks, identify slow AI model calls, and more.

Read more →

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay