.NET Core 3.1 + Redis: do cache distribuído ao uso como banco NoSQL
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: