.NET Core 3.1 + Redis: do cache distribuído ao uso como banco NoSQL

Renato Groffe
3 min readMar 16, 2020

--

Banco de dados NOSQL do tipo chave-valor, o Redis é uma alternativa open source extremamente popular entre Desenvolvedores Web. Um dos usos mais comuns desta tecnologia consiste na implementação de cache distribuído (algo essencial em cenários envolvendo a necessidade de escalar uma aplicação), valendo-se para isto da excelente performance em operações de leitura oferecida pelo Redis (graças ao armazenamento de dados em memória).

Já abordei o uso do Redis como solução para cache com ASP.NET Core no seguinte artigo:

ASP.NET Core: dicas úteis para o dia a dia de um Desenvolvedor - Parte 3

A configuração do cache baseado em Redis requer que o package Microsoft.Extensions.Caching.Redis seja adicionado a um projeto ASP.NET Core:

O Redis como mecanismo de cache será ativado então por meio de uma chamada ao método AddDistributedRedisCache na classe Startup (mais precisamente dentro da operação ConfigureServices):

E a interação com valores armazenados em cache a partir de uma instância do Redis acontecerá através de instâncias de IDistributedCache (namespace Microsoft.Extensions.Caching.Distributed):

O repositório do projeto apresentado nestas primeiras listagens já está disponível no GitHub:

ASP.NET Core 3.1 + API REST + SQL Server + Cache com Redis

Para a utilização do Redis criei um container Docker tomando por base as instruções do seguinte artigo:

Docker - Dica Rápida: criando uma instância do Redis via Docker Compose

Mas a utilização de Redis se restringe apenas a implementações para cache?

A resposta a essa questão é NÃO! O Redis pode ser empregado como um excelente meio para o compartilhamento de dados entre aplicações, oferecendo uma excelente performance na leitura de dados quando comparado a alternativas mais tradicionais como bancos relacionais (sem obviamente descartar o uso dos mesmos, mas coexistindo com tais alternativas).

E de que forma faríamos a interação com o Redis em .NET Core e ASP.NET Core nestes cenários?

Através do uso da biblioteca open source StackExchange.Redis. Na próxima listagem temos um exemplo de uso deste package em uma Console Application:

Em CotacoesContext podemos observar:

  • O uso da classe ConnectionMultiplexer (namespace StackExchange.Redis) para a geração de uma nova conexão com uma instância do Redis (linha 19);
  • Através de uma chamada ao método GetDatabase (linha 22) será retornada uma instância de acesso a um banco de dados do Redis;
  • Ao invocar o método StringSet a partir desta última referência uma chave e seu respectivo valor serão armazenados no Redis (especificando ou não um tempo de expiração no parâmetro expiry).

Na próxima imagem podemos observar os dados carregados ao executar esta aplicação (acessando o Redis por meio da ferramenta FastoRedis):

O código-fonte desse projeto já está disponível no GitHub:

.NET Core 3.1 + Redis + Selenium WebDriver + StackExchange.Redis + Chrome Driver

Já na próxima listagem temos a classe RedisConnection, definida em uma API REST criada com o ASP.NET Core 3.1:

  • Uma instância de ConnectionMultiplexer foi gerada no construtor (linha 11), servindo de base para a conexão com um banco do Redis;
  • No método GetValueFromKey uma chamada ao método StringGet (linha 18) trará o valor associado a uma chave numa base do Redis (previamente carregada através do exemplo anterior).

Para esta API REST a classe RedisConnection foi configurada para uso de uma única instância como um Singleton em Startup (linha 21):

E finalmente a Action Get do Controller CotacoesController receberá a instância de RedisConnection por injeção de dependência:

Os fontes deste último projeto também já foram disponibilizados no GitHub:

ASP.NET Core 3.1 + API REST + Redis + StackExchange.Redis

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker