Você pode ir direto ao projeto completo aqui no meu github.
Introdução
O objetivo deste artigo é configurar o Laravel para rodar no Docker com cache do Redis, mas teremos o Mysql também o/
O Laravel é um dos frameworks mais poderosos da linguagem PHP e além de uma curva de aprendizagem muito pequena, você pode construir aplicações muito simples e outras bastante robustas. Tudo depende da sua imaginação 🙂
Redis é uma estrutura de armazenamento de dados em memória. Pode ser utilizado como banco de dados, cache e message bloker. O Redis não armazena apenas strings (quando simplificamos o conceito de chave x valor), mas é capaz de armazenar estruturas de dados mais complexas. Você pode se aprofundar um pouco mais na documentação aqui.
Docker é a salvação dos aflitos. Se você já chorou nas configurações dos seus ambientes de desenvolvimento e até produção, sabe que o Docker impediu a queda de muitos fios de cabelo. De forma bem simplificada, essa ferramenta facilita o gerenciamento da infraestrutura das aplicações, impactando positivamente no processo de criação, manutenção e escala dos serviços.
Requisitos
É necessário ter o Docker instalado em sua máquia. O restante faremos tudo por dentro do container.
Clone o projeto deste tutorial para seguir os passos abaixo.
Configuração
Passo 1
Acesse a pasta do seu projeto Laravel para configurar o docker-compose.yml . Você pode ver o arquivo completo neste link, mas quero chamar atenção para a configuração do redis. Nós teremos um container separado para ele, veja:
- Todos os containers fazem parte da mesma rede localhost;
- O nome do nosso container é app_redis;
No arquivo config/database.php adicionei o redis como uma conexão (dentro do array connections). Ficou assim:
Passo 2
Precisamos configurar o mysql e o redis no arquivo .env . Observe que tanto o DB_HOST quanto o REDIS_HOST são os nomes dos services no nosso docker-compose.yml . Estas informações serão recuperadas e utilizadas no arquivo config/database.php do passo 1.
Agora acesse um terminal de sua preferência e (de dentro da pasta do projeto) rode o comando: docker-compose up -d
.
Passo 3
Com o Docker rodando lindamente, vamos acessar o container app_laravel
com o comando docker exec -it app_laravel bash
e executar as migrations para testar o cache do redis.
Porém antes de mais nada, execute o composer para instalar as dependências. De dentro do container, execute: composer install
.
Agora sim, execute as migrations para criar a tabela pessoas: php artisan migrate
e execute o seed para popular a tabela com 500 registros: php artisan db:seed
.
Fique a vontade para alterar a quantidade de registros a serem adicionados no banco. Acesse o arquivo database/seeders/DatabaseSeeder.php
e seja feliz!
Passo 4
Estamos prontos para testar! Acesse as seguintes rotas no seu navegador ou no Postman:
- http://localhost:8002/api/pessoas/sem-cache → para ver o tempo de recuperação dos dados sem cache (direto do banco);
- http://localhost:8002/api/pessoas/set-cache → para colocar os registros em cache;
- http://localhost:8002/api/pessoas/cache → para recuperar os registros do cache;
Testes que fiz no Postman:
- sem cache: 10.47 segundos;
- com cache: 3,81 segundos;
Passo 5
Vamos recuperar os registros de outra forma, para termos certeza que estamos utilizando o cache do redis.
De dentro do container app_laravel
entre no tinker: php artisan tinker
e rode os comandos:
use Illuminate\Support\Facades\Redis;
Redis::get('pessoas');
Vamos acessar diretamente o container do Redis e verificar se nossa chave “pessoas” existe lá. Primeiro saia do container app_laravel
e execute:
docker exec -it app_redis redis-cli
EXISTS laravel_database_pessoas
Você pode executar também: KEYS * para listar todas as chaves. Perceba que as chaves possuem um prefixo “laravel_database_” antes da chave que criamos na aplicação, mas isso já está abstraído pela implementação do Redis feita pelo Laravel.
Conclusão
As configurações são simples, porém nem sempre ficam claras quando buscamos alguns artigos pela internet. Espero que você faça bom uso destas informações 🙂
Conhecimento é algo que ninguém pode tirar de você e quando é compartilhado não se perde, multiplica.