Neste artigo falarei sobre o Redis, uma tecnologia de cache distribuído, e como utilizá-lo em sua aplicação ASP.NET Core.
Os fundamentos do uso de um cache de memória podem ser lidos nesse artigo. Nele também está contido o exemplo a ser utilizado aqui.
Vamos lá?
O Redis
O Redis é uma estrutura de dados em memória, que pode ser utilizada de diversas maneiras. Entre elas, encontra-se como cache e banco de dados,
Ele é reconhecido por sua alta performance devido à sua característica de estar na memória. Além disso, ele contém algumas funcionalidades, tais como:
- Transações
- Replicação
- Recuperação de falha
- Mensageria
- Definição de tempos de expiração para dados
Em contraste ao cache de memória apresentado no artigo anterior, o Redis é indicado para sistemas distribuídos, já que centralizaria o armazenamento de objetos em memória com alta performance. Também oferece capacidades bem importantes a sistemas do tipo, como tolerância a falhas e replicação, se mostrando uma alternativa resiliente para sistemas distribuídos.
Inicializando uma instância de Redis
Para uma maior praticidade, estou utilizando o Docker para inicializar uma instância do servidor Redis local. O comando utilizado está logo abaixo.
Para se conectar com o servidor Redis, eu utilizo o Redis Desktop Manager.
Configurando
Ele pode ser adicionado a uma aplicacão ASP.NET Core através de uma chamada ao método de extensão AddStackExchangeRedisCache, do namespace Microsoft.Extensions.Caching.StackExchangeRedis, no método ConfigureServices da classe Startup. Instale esse pacote no seu projeto utilizando o NuGet.
Ao chamar esse método, deverá ser passada a configuração (como se fosse uma string de conexão), e o nome da instancia, como na imagem abaixo.
O nome da instância será utilizado no momento de criar o nome da chave no Redis.
Implementando uma solução usando o Redis
Com base no exemplo anterior, voce utilizará também a API pública RestCountry, para obter dados de países do mundo.
A classe Country, para representação dos dados a serem salvos está implementada logo abaixo.
Logo após a definição dela, o controller CountriesController é criado. Em seguida, a Action GetCountries é implementada, acessada pelo método HTTP GET para o caminho api/countries.
No exemplo acima, note o fluxo:
- Obtenho os dados do Redis com chave especificada na constante COUNTRIES_KEY.
- Se é diferente de vazio ou nulo, retorno OK com os dados armazenados no cache. Esse é o caminho mais rápido.
- Em caso negativo, defino a URL para chamada HTTP.
- Instancio um objeto HttpClient
- Realizo a chamada para a URL definida, obtendo o retorno como um string, e deserializando em uma lista de Country.
- Instancio as configurações de cache de Redis, definindo um tempo absoluto de expiração (de 1 hora, ou 3600 segundos), e um tempo relativo cuja contagem vai sendo reiniciada a cada acesso (de 20 minutos, ou 1200). Com isso, com 20 minutos sem acesso algum a entrada na memória já é removida. Ou, em caso de muitos acessos, em 1 hora ela será removida de qualquer forma.
- Salvo o objeto retornado pela API no cache do Redis.
- Retorno OK com a lista.
A classe para a configuração é a DistributedCacheEntryOptions, e a que interface que realiza as operações é a IDistributedCache.
É mostrado abaixo a chave criada no Redis após uma chamada a essa API. Note que é feita uma concatenação do InstanceName (definido na configuração do Redis na classe Startup) e a chave definida no momento de inserção.
Quer alavancar sua carreira como Desenvolvedor(a) .NET?
Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.
Conheça o Método .NET Direto ao Ponto, minha plataforma com mais de 800 videoaulas, com cursos cobrindo temas relacionados a linguagem C# e Programação Orientada a Objetos, APIs REST com ASP NET Core, Microsserviços com ASP NET Core, HTML, CSS e JavaScript, Desenvolvimento Front-end com Angular, Desenvolvimento Front-end com React, JavaScript Intermediário, TypeScript, Formação Arquitetura de Software, Microsoft Azure, Agile, SQL, e muito mais.
Inclui comunidade de centenas de alunos, suporte por ela, plataforma e e-mail, atualizações regulares e muito mais.
Interessante, certo? Para mais informações, deixo o link de documentação da interface IDistributedCache.
Com esse artigo e o anterior, cobri tanto o cache em memória, mais adequado a sistemas monolíticos, que não precisarão compartilhar com outras aplicações o cache, quanto o Redis, mais adequado a sistemas distribuídos.
Até logo!
Dev .NET Sênior com experiências para Irlanda e Estados Unidos, 2x Microsoft MVP, 9x Microsoft Certified, MBA em Arquitetura de Soluções, Fundador e Instrutor LuisDev Treinamentos,