ASP.NET Core e Redis: utilizando cache distribuído em sua aplicação

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á?

Código-fonte aqui.


Quer ser notificado sobre os próximos artigos, lives semanais, eventos e treinamentos? Entre no canal LuisDev no Telegram!


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.

Inicializando container Docker contendo o Redis

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.

Configurando o Redis na classe Startup

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.

Definição da classe Country

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.

Classe Controller responsável por retornar os dados de países obtidos de outra API ou do Redis

No exemplo acima, note o fluxo:

  1. Obtenho os dados do Redis com chave especificada na constante COUNTRIES_KEY.
    1. Se é diferente de vazio ou nulo, retorno OK com os dados armazenados no cache. Esse é o caminho mais rápido.
  2. Em caso negativo, defino a URL para chamada HTTP.
  3. Instancio um objeto HttpClient
  4. Realizo a chamada para a URL definida, obtendo o retorno como um string, e deserializando em uma lista de Country.
  5. 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.
  6. Salvo o objeto retornado pela API no cache do Redis.
  7. 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.

Chave criada no Redis

Inscreva-se na lista de espera do Método .NET Direto ao Ponto, um treinamento completo sobre C#, APIs com ASP.NET Core e Microsserviços:  Inscreva-se aqui.

São quase 200 vídeo-aulas sobre temas como C#, ASP NET Core 5, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e 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!