Pular para o conteúdo
Código e Café com PauloDev: Explorando o Universo da Programação

Código e Café com PauloDev: Explorando o Universo da Programação

Explore o universo da programação e tecnologia com PauloDev. Descubra insights, tutoriais e inovações que moldam o futuro digital. De linhas de código a ideias revolucionárias, embarque nesta jornada tech onde a paixão pela inovação se encontra com a expertise do desenvolvimento. Seja bem-vindo ao blog que transforma códigos em narrativas de vanguarda, guiado pela visão única de PauloDev no vasto panorama tecnológico.

  • Meu portifolio

Redis com Laravel: Uma ferramenta poderosa para o escalonamento horizontal da sua aplicação

30 de novembro de 2024
Por Paulo In Boas Práticas, Laravel

Redis com Laravel: Uma ferramenta poderosa para o escalonamento horizontal da sua aplicação

Vamos imaginar o seguinte cenário, você tem uma aplicação Laravel rodando em um container Docker, nela você tem queues configuradas, um sistema de cache em memória rodando e as sessions da sua aplicação sendo armazenadas no local default da aplicação. Porém, em um determinado dia, por conta da alta demanda do sua aplicação e a necessidade de melhorar a segurança, você decide configurar um servidor de Load Balance na sua aplicação usando NGINX e Docker, subindo outras 3 instâncias da sua aplicação e configurando o Proxy do NGINX para funcionar o Load Balance.

Você já deve ter pensado o seguinte “se tenho 3 instâncias da mesma aplicação, como vou fazer para meu cache e minhas sessions rodarem sendo que elas existem apenas no contexto de uma instância?”, esse é o ponto que quero chegar, e para isso temos o Redis.

Caso você não conheça, o Redis (Remote Dictionary Server) é uma solução de armazenamento de dados em memória, de código aberto, extremamente rápida e versátil. Apesar de ter citado o contexto em uma aplicação Laravel, o Redis não se limita apenas ele, sendo possível utilizá-lo em qualquer linguagem que tenha o suporte a conexão.

Além de diversos outros casos de uso, o Redis é amplamente utilizado como cache, e message broker. Desenvolvido em C, o Redis oferece desempenho excepcional e suporta uma ampla gama de estruturas de dados. Como principais características temos o seguinte:

  • Armazenamento em memória: Diferente de um banco de dados tradicional, que armazena seus dados em arquivos, o Redis salva os dados diretamente na memória RAM, o que torna as operações de leitura e gravação muito rápidas. Ele também pode persistir dados no disco para garantir durabilidade, caso você queira.
  • Estruturas de dados ricas: Dentre as diversas estruturas suportadas, as principais são:
    • Strings
    • Hashes
    • Lists (listas ordenadas)
    • Sets (conjuntos)
    • Sorted Sets (conjuntos ordenados)
    • Bitmaps
    • HyperLogLogs
    • Streams
    • Geospatial Indexes (para trabalhar com coordenadas geográficas)
  • Suporte a transações: Permite que múltiplas operações sejam executadas como uma unidade atômica.
  • Cluster Redis: Oferece uma solução nativa para escalabilidade horizontal, permitindo o uso de múltiplos nós

Claro que existem mais, mas essas são apenas algumas para você ter uma leve noção do poder do Redis.

O escalonamento horizontal

Afinal de contas, o que é esse escalonamento horizontal citado anteriormente? E por que eu iria quebrar minha aplicação que já está funcionando e perder tempo configurando esse tal de Redis?

Vamos lá, o escalonamento horizontal (ou scale-out) é uma estratégia de aumentar a capacidade de um sistema distribuído adicionando mais máquinas (ou nós) na infraestrutura existente. Em vez de aumentar o poder de processamento de um único servidor (que seria o escalonamento vertical, e que geraria mais custos para sua empresa), o escalonamento horizontal distribui a carga de trabalho entre vários servidores ou instâncias, que operam de maneira cooperativa.

Portanto, em um cenário que sua aplicação está tendo um grande nº de demandas, e você precisa melhorar o desempenho da sua aplicação, que por sua vez, está recebendo várias requisições de uma só vez, o escalonamento horizontal se faz necessário.

Como disse anteriormente, já que temos novas instâncias de uma mesma aplicação, usamos o Redis (ou qualquer outro banco de dados distribuído) para gerenciar recursos como cache, session, etc, da nossa aplicação.

Configurando o Redis em uma aplicação Laravel

Para o exemplo a seguir, estarei usando o Laravel pela simplicidade, mas você pode seguir como base para implementar na sua linguagem preferida. Vamos iniciar criando um container com Docker para subir uma instância do Redis, para isso iremos utilizar o docker-compose, o arquivo ficará da seguinte forma:

version: '3.8'

services:
  redis:
    image: redis
    restart: unless-stopped
    ports: 
      - 6379:6379

Agora, basta rodar nosso container:

docker-compose up --build

Em seguida, vamos seguir as recomendações da documentação oficial do Laravel e instalar pacote predis/predis, para isso, no terminal rode o seguinte:

composer require predis/predis

Apenas para contextualização, o Laravel solicita a instalação do pacote predis/predis porque esse é um cliente PHP para o Redis, amplamente utilizado para integrar aplicações Laravel com um servidor Redis. Por padrão, o Larvel suporta o redis por meio do driver redis, que pode ser configurado no arquivo config/database.php e no config/cache.php. Contudo, para que o Laravel consiga se comunicar com o Redis, é necessário um cliente Redis compatível.

Seguindo nossa configuração, agora vamos configurar nosso projeto para usar o Redis. Com o nosso container rodando, vamos configurar .env do nosso projeto para se conectar com o Redis:

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_CLIENT=predis

Pronto, nosso projeto já está conectado com o Redis, basta chamar o cliente do Redis para utilizar. Antes de mostrar exemplos de uso, como disse anteriormente, você também pode configurar o Redis para ser usado como session storage, é bem simples, basta mudar o SESSION_DRIVER no .env do seu projeto:

SESSION_DRIVER=redis

Exemplos de uso, utilizando o Redis para cache

Com o Redis configurado no nosso projeto, nada melhor que alguns exemplos práticos, não é? Vamos iniciar com o básico, armazenar e recuperar um valor do cache:

use Illuminate\Support\Facades\Cache;

// Armazenar um valor por 10 minutos
Cache::put('key', 'value', 600);

// Recuperar o valor
$value = Cache::get('key');

// Recuperar com valor padrão, caso a chave não exista
$value = Cache::get('non_existent_key', 'default_value');

Podemos também, armazenar um valor para sempre no nosso projeto. Mas vale uma atenção, o armazenamento “para sempre” no Redis, como definido pelo comando SET sem um tempo de expiração ou usando o método Cache::forever no Laravel, mantém os dados na memória RAM, que é o principal meio de armazenamento do Redis. Isso significa que os dados são extremamente rápidos para leitura e escrita, mas podem ser perdidos se o servidor Redis for reiniciado ou se houver uma falha de hardware.

Cache::forever('key', 'value');

// Remover a chave manualmente
Cache::forget('key');

Podemos também, setar um tempo de expiração para o nosso dado:

Cache::put('user_data', ['name' => 'John', 'email' => 'john@example.com'], now()->addMinutes(30));

Por fim, podemos utilizar cache de consultas no Laravel, só que antes, devemos mudar o CACHE_DRIVER no nosso .env para redis, que por padrão, vem como file::

CACHE_DRIVER=redis

Agora, basta chamar o cache para armazenar os dados das suas consultas:

use Illuminate\Support\Facades\Cache;
use App\Models\User;

$users = Cache::remember('users', 3600, function () {
  return User::all();
});

Além dos exemplos anteriores, que focam em armazenar apenas dados de consulta, podemos armazenar páginas inteiras para melhorar o desempenho da sua aplicação, claro, sempre intérprete para o contexto da sua aplicação, verificando se é necessário ou não:

use Illuminate\Support\Facades\Cache;

$html = Cache::remember('homepage', 3600, function () {
  // Gera o HTML da página
  return view('homepage')->render();
});

echo $html;

Por fim, podemos remover um cache salvo anteriormente, basta usar o seguinte comando:

Cache::forget('users');

Conclusão

Apesar de focar na implementação e exemplos no Laravel, o Redis se mostra versátil e fácil de implementar nas principais linguagens utilizadas no mercado hodiernamente. Os exemplos que citei, apesar de simples, irão trazer um ganho considerável para seu projeto e abrir portas para o escalonamento horizontal, já que agora, você não depende de que os dados sejam armazenados nos arquivos de apenas uma instância da sua aplicação.

Lembre-se sempre de olhar a documentação oficial da linguagem que você usa, quase sempre terá o que você está procurando. O Laravel por sua vez, traz ótimos exemplos e uma documentação bem escrita, o que facilita o uso das ferramentas que ele nos oferece, o que, na minha opinião, era o ideal para esse artigo, já que a ideia principal é te mostrar o que é o Redis e como usá-lo rapidamente.

Promoção
Written by:

Paulo

Ver todos os posts

Categorias

  • Android
  • Android Studio
  • Angular
  • API
  • AWS
  • Back-end
  • Bash
  • Boas Práticas
  • CSharp
  • CSS
  • Django
  • Docker
  • Electron
  • Front-end
  • Git
  • Github
  • Html
  • Http
  • Java
  • JavaScript
  • Laravel
  • Linha de comando
  • Linux
  • Machine Learning
  • Metodologias
  • Mysql
  • Node
  • NoSql
  • PHP
  • Power Shell
  • Python
  • Segurança
  • Sem categoria
  • SQL
  • Tecnologia
  • Testes
  • VueJs
  • Windows

Últimos posts

  • Python para o desenvolvimento Web: Como o Django pode alavancar na escrita do seu código
  • Conheça as Transactions e como elas podem te ajudar a testar o seu sistema
  • Melhorando a performance dos seus projetos PHP, conheça o OPCache e o JIT
  • Redis com Laravel: Uma ferramenta poderosa para o escalonamento horizontal da sua aplicação
  • Conhecendo e configurando um servidor de Load Balance com YARP e NGINX

© Todos os direitos reservados PauloDev 2023