![Destaque de startup: Hard Skill Exchange e transformação FINQ em negócios e tecnologia](https://optimuscloud.com.br/wp-content/uploads/2024/06/1718298008_Destaque-de-startup-Hard-Skill-Exchange-e-transformacao-FINQ-em-150x150.png)
Destaque de startup: Hard Skill Exchange e transformação FINQ em negócios e tecnologia
13 de junho de 2024![Featued image for: Trash Pandas Love Enterprise Java Code](https://optimuscloud.com.br/wp-content/uploads/2024/06/1718300644_Trash-Pandas-adoram-codigo-Java-empresarial-150x150.png)
Trash Pandas adoram código Java empresarial
13 de junho de 2024Sem dúvida, muitos de nós já experimentamos a frustração de concluir um projeto apenas para descobrir que nosso aplicativo poderia ser melhor na busca de dados do back-end. Isso não só prejudica a eficiência da nossa aplicação, mas também afasta os usuários, obrigando-os a buscar alternativas. Consequentemente, uma ideia de aplicação brilhante pode tornar-se pouco confiável e inutilizável. Mas existe uma solução para enfrentar esses desafios.
O cache é a chave para melhorar o desempenho do aplicativo. Quando implementado de forma eficaz, pode elevar significativamente a experiência do usuário, simplificando o desempenho. Vamos explorar os fundamentos do cache.
Em essência, o cache envolve o armazenamento temporário de dados recuperados do banco de dados. Quando ocorrem solicitações subsequentes para os mesmos dados, em vez de esperar que a API os recupere novamente, o aplicativo de back-end entrega perfeitamente os dados armazenados em cache.
Ilustrarei esse conceito usando uma pilha abrangente que inclui Nest.js, Redis, Redis-commander, npm, Docker e Postman. Nest.js, uma estrutura de back-end robusta construída em Node.js e aproveitando TypeScript, servirá como nossa base. O Redis, conhecido por seu desempenho de alta velocidade, atuará como nosso banco de dados de cache, enquanto o npm facilitará o gerenciamento de pacotes. O Docker nos permitirá conteinerizar o banco de dados Redis, melhorando a escalabilidade e a eficiência da implantação. Além disso, o Redis-commander fornecerá uma interface amigável para monitorar nosso banco de dados de cache. Finalmente, o Postman, uma ferramenta versátil para testes de API e tratamento de solicitações, desempenhará um papel fundamental.
Primeiro, abra o terminal e use o Nest CLI para criar um novo aplicativo Nest.js. Depois que o aplicativo tiver sido estruturado com êxito, navegue até a pasta do projeto e abra-o usando o VS Code ou qualquer outro editor de código de sua preferência.
A seguir, instale alguns pacotes que nos ajudarão a atingir nosso objetivo. É importante observar que não usaremos cache na memória, uma técnica oferecida por muitas estruturas de back-end. Embora o cache na memória tenha suas vantagens, como velocidade, ele também apresenta desvantagens notáveis. O mais significativo é que os dados são armazenados na RAM, o que pode não ser o ideal, principalmente se o seu servidor ou máquina de hospedagem tiver recursos limitados.
No editor de código, abriremos um novo terminal e instalaremos dependências executando os seguintes comandos.
Para começar, navegaremos até o src
pasta e abra o app.module.ts
arquivo e, em seguida, importe e registre o CacheModule
. Além disso, configuraremos o módulo passando um objeto de parâmetros. Esses parâmetros permitirão que nosso aplicativo se conecte ao banco de dados Redis, que iremos encaixar posteriormente.
Como é evidente no app.module.ts
arquivo, o CacheModule
foi importado e registrado com sucesso. Além disso, inicializamos um objeto de parâmetros para configurar nosso cache-store. Esses parâmetros incluem:
store
: Define o armazenamento de cache a ser usado.host
: especifica o servidor onde nosso banco de dados Redis será executado.port
: Indica a porta pela qual o Redis será acessado.username
epassword
: Deixado em branco para nossos propósitos.- Outras propriedades notáveis, como
ttl
(time to live), que determina por quanto tempo os dados são armazenados em cache no banco de dados, pode ser adicionado se necessário. Entretanto, para o escopo deste artigo, não o incluiremos, pois não é crítico para nossa demonstração.
Para interagir com o banco de dados cache, precisamos injetar o CACHE_MANAGER
instância em nosso controlador. Esta instância serve como intermediária para a comunicação entre nosso controlador de aplicação e o banco de dados de cache, daí a necessidade de realizar a verificação no nível do controlador. Se os dados já existirem no banco de dados cache, o serviço não estará envolvido no processo.
Após a injeção do gerenciador de cache, definimos uma função chamada getSampleData
dentro do controlador. Esta função é responsável por retornar um objeto contendo propriedades como id
(corda), items
(matriz de números) e users
(matriz de strings). Internamente, esta função chama outro método, getSampleData
que reside dentro do AppService
classe definida no app.service.ts
arquivo.
Além disso, injetamos o AppService
no controlador, concedendo acesso aos seus membros. A rota do nosso controlador foi configurada para /api/test/cache
servindo como endpoint para testar nossa configuração de cache.
Agora, vamos mergulhar na parte emocionante! O cache_manager
oferece uma variedade de métodos, mas nos concentraremos em quatro ou cinco deles.
Primeiro, temos o get(key)
O método, que aceita uma chave como entrada, recupera os dados correspondentes do banco de dados cache e os retorna.
O próximo é o set(key, value)
método. Diferente get
esse método usa uma chave e um valor como parâmetros e os armazena no banco de dados cache.
Seguindo em frente, temos o del(key)
método. Quando invocada, esta função exclui os dados associados à chave especificada do banco de dados de cache.
Finalmente, vamos explorar o reset()
método. Esta função poderosa limpa todo o banco de dados de cache, deixando-o vazio e pronto para novos dados.
Com esses métodos à nossa disposição, estamos equipados para gerenciar com eficácia nosso banco de dados de cache e otimizar o desempenho de nosso aplicativo. Munidos da compreensão das funções mencionadas, vamos aprimorar a nossa getSampleData
funções dentro do controlador. Quando uma solicitação é recebida, o controlador primeiro verifica o banco de dados de cache. Se existirem dados armazenados em cache, o controlador os retornará imediatamente ao usuário, sem a necessidade de invocar o serviço. No entanto, se nenhum dado em cache for encontrado, o controlador chamará o serviço para buscar os dados. Depois que os dados forem recuperados, eles serão armazenados em cache para solicitações futuras antes de serem devolvidos ao usuário. Essa abordagem otimiza o desempenho minimizando chamadas desnecessárias ao serviço.
Aqui está uma explicação refinada das alterações feitas em nosso controlador:
Nós transformamos o getSampleData
função em uma função assíncrona, indicando que ela retorna uma promessa. Conseqüentemente, o tipo de retorno da função foi atualizado para uma promessa que resolve um objeto com propriedades predefinidas.
Ao receber uma solicitação, o controlador primeiro verifica se há dados em cache correspondentes à chave ‘UD’. Se tais dados existirem (verificados com if (cachedData)
), ele será retornado ao usuário como uma resposta JSON.
Caso nenhum dado em cache seja encontrado, o controlador continua a chamar o getSampleData
método do AppService
. Após a recuperação dos dados, eles são convertidos em uma string e armazenados no banco de dados cache com a chave ‘UD’ usando this.cacheManager.set('UD', JSON.stringify(fetchedSampleData))
. Posteriormente, os dados são devolvidos ao usuário.
Para garantir uma execução perfeita, o getSampleData
função no app.service.ts
O módulo também foi modificado para ser assíncrono. Isto permite o uso do await
palavra-chave ao invocar a função no controlador, evitando problemas com valores indefinidos.
O próximo passo envolve a criação de um docker-compose.yml
arquivo. Este arquivo facilitará a extração de imagens do Redis e do Redis-commander, permitindo-nos executar os contêineres sem esforço. Com Docker Compose, definiremos os serviços necessários para nosso projeto, incluindo Redis para nosso banco de dados de cache e Redis-commander para uma interface amigável. Depois de configurado, o Docker Compose orquestrará a configuração, garantindo que os contêineres estejam funcionando perfeitamente.
Para fornecer uma visão geral concisa, o version
A diretiva, definida como ‘3.8’, denota a versão do formato de arquivo Docker Compose em uso. Posteriormente, definimos os serviços a serem executados, nomeadamente Redis e Redis-commander. Cada serviço está associado a uma imagem que o Docker recuperará para instanciar os respectivos containers.
A respeito de Ports
configuração, especifica as portas nas quais os contêineres irão operar. Essas portas são então mapeadas para permitir o acesso externo.
Para elaborar variáveis específicas dentro do redis-commander
serviço, o environment
A variável ajuda a especificar a localização do Redis ao qual o comandante do Redis se conectará. Além disso, o container_name
atributo designa o nome do contêiner, enquanto hostname
denota o nome do host atribuído ao contêiner. Embora o nome do contêiner e o nome do host sejam autoexplicativos, eles são componentes essenciais do gerenciamento de contêineres. Agora voltamos ao terminal para executar o arquivo Docker Compose, iniciando os processos de construção e inicialização de nossos serviços. Antes de executar o comando abaixo, certifique-se de ter o Docker Desktop instalado em seu sistema. Caso contrário, você pode baixá-lo no site oficial do Docker. Caso contrário, tentar executar o comando sem o Docker Desktop instalado resultará em erro.
Com ambos os contêineres funcionando perfeitamente e sem erros, podemos prosseguir para abrir o Postman. A partir daí, começaremos a enviar solicitações para testemunhar o cache em ação em primeira mão. Além disso, navegaremos para http://127.0.0.1:8081
para acessar a interface do comandante Redis. Esta interface nos permitirá monitorar e gerenciar o conteúdo do nosso banco de dados Redis, fornecendo informações valiosas sobre suas operações.
Certamente, atingir um tempo de resposta de 52 milissegundos para uma API é bastante satisfatório. Ao verificar nosso comandante Redis, podemos confirmar a preservação bem-sucedida de nossos dados sob a chave “UD”. Agora, vamos explorar as vantagens do armazenamento em cache iniciando outra solicitação. Isto nos permitirá testemunhar diretamente como o cache otimiza os tempos de resposta, aumentando assim a eficiência geral da nossa aplicação.
E aí está! Graças à magia do cache, o tempo de resposta da nossa API caiu para apenas 9 ms. Isso não representa nem metade do tempo que a solicitação inicial levou para retornar uma resposta. Isso ressalta o papel indispensável que o cache desempenha no desenvolvimento de back-end.
O cache não é apenas uma técnica; é uma virada de jogo. Ele melhora drasticamente o desempenho, eleva a experiência do usuário e otimiza a utilização de recursos. Ao armazenar de forma inteligente os dados acessados com frequência, o cache minimiza cálculos redundantes e consultas ao banco de dados, resultando em respostas extremamente rápidas e interações mais suaves com o usuário.
No mundo dinâmico do desenvolvimento web, onde a velocidade é fundamental e as expectativas dos usuários são cada vez maiores, o cache surge como um farol de eficiência. Concluindo, nossa jornada pelo domínio do cache iluminou seu poder transformador na otimização do desempenho de back-end. Desde a redução significativa dos tempos de resposta da API até a melhoria da experiência geral do usuário, o cache surge como uma técnica fundamental no desenvolvimento web moderno.
Ao armazenar e recuperar dados de forma inteligente, o cache minimiza a sobrecarga computacional e a carga do banco de dados, resultando em aplicativos mais rápidos e responsivos. Através de nossa exploração, testemunhamos em primeira mão como o cache pode revolucionar o desempenho dos aplicativos, garantindo interações mais suaves com o usuário e maior eficiência.
À medida que navegamos no cenário em constante evolução do desenvolvimento web, fica claro que o cache continua sendo uma ferramenta vital em nosso arsenal. Sua capacidade de agilizar operações, aumentar a escalabilidade e elevar a confiabilidade dos aplicativos ressalta seu status como pilar fundamental da arquitetura de back-end.
Na nossa busca pela excelência, vamos adotar o cache como um princípio fundamental, aproveitando as suas capacidades para criar experiências digitais excecionais que deixem uma impressão duradoura nos utilizadores. Juntos, vamos continuar a desbloquear todo o potencial do cache e impulsionar nossos aplicativos a novos patamares de desempenho e inovação.
Interessado em saber mais sobre como navegar em seus dados? As organizações orientadas por dados podem superar os seus concorrentes em 6% em rentabilidade e 5% em produtividade. O que significa ser orientado por dados? E como você pode navegar pelos dados como líder? Confira nosso guia.
A postagem Eficiência de desenvolvimento de back-end: o papel crítico do cache apareceu pela primeira vez em The New Stack.