Azure Redis Cache e .NET 5

O Redis (Remote Dictionary Server) é uma estrutura de armazenamento de dados absurdamente performático, de código aberto que pode ser usado como banco de dados, cache ou message broker (Publish-Subscribe), além de ser uma poderosa tecnologia a favor da performance das suas aplicações.

Seja lá qual for o seu cenário (microsserviço ou monolito) o Redis é praticamente obrigatório no seu ambiente, com ele é possível trazer diversos benefícios, como:

  • Rapidez no acesso à dados: Todos os dados no Redis são armazenados na RAM, proporcionando os tempos de acesso mais rápidos possíveis aos dados para solicitações de leitura e gravação.
  • Simplicidade e facilidade de uso: O Redis simplifica a codificação, reduzindo a quantidade de código necessária para armazenar, acessar e usar dados em aplicativos e APIs.
  • Todas as operações são atômicas: Garantindo que, se dois clientes acessarem simultaneamente uma chave, o servidor Redis receberá o valor atualizado, ou seja, o que chegou primeiro ele vai executar.
  • Alta disponibilidade e escalabilidade: Com o Redis você pode criar soluções altamente disponíveis que oferecem performance e confiabilidade consistentes.

Observações:

  • Ele não substitui o banco de dados relacional: O Redis é indicado como mecanismo de cache de dados do seu banco relacional, evitando um carga de leitura na sua base.
  • Não é um banco de dados que você deveria usar para armazenar todos os seus dados: Muito menos dados serializados onde a gravação e leitura é menos performática.

Beleza, agora vamos direto ao ponto: Azure Redis Cache e .NET 5:

Azure Redis Cache

O Azure disponibiliza três tipos de contratação do Redis Cache, que são:

Basic

  • Esta é a camada com menos recursos e menos taxa de transferência e latência mais alta.
  • Você deve usar esta camada apenas para fins de desenvolvimento ou teste
  • Sem SLA

Standard

  • Cache replicado em uma configuração primário/secundário de dois nós gerenciado pela Microsoft
  • SLA de 99,9%

Premium

  • Cluster Redis de nível empresarial gerenciado pela Microsoft.
  • Essa camada oferece o grupo completo de recursos com a maior taxa de transferência e latências mais baixas.
  • Implementado em hardware mais poderoso.
  • SLA de 99,9%

O lado bom de contratar o Azure é que ele fica responsável de fazer todas manutenções e correções de patch de segurança, deixando você livre para pensar somente no desenvolvimento. Mais informações no link abaixo:

https://docs.microsoft.com/pt-br/azure/azure-cache-for-redis/cache-overview

Para contratar o Redis, clique em Azure Cache for Redis no seu painel Azure, feito isso clique em Add e preencha as configurações conforme imagem abaixo:

Neste exemplo utilizaremos a camada Standard, que pode ser utilizado sem preocupações em seu ambiente de produção.

O próximo passo é configurar o Networking onde é possível escolher a forma de acesso ao Redis via endpoint público, VPN ou por um endpoint privado. No nosso caso vamos seguir como acesso público conforme imagem abaixo:

Feito isso, basta clicar na aba Review + create e solicitar a criação.

A primeira configuração a ser feita n Redis logo depois de criado é ajustar a memória reservada e fragmentação. Clique em Advanced settings e configure conforme a imagem abaixo:

A configuração do maxmemory-reserved e maxfragmentationmemory-reserved ajusta a quantidade de memória que é reservada para operações não-cache, como replicação durante failover. Definir esse valor permite que você tenha uma experiência de servidor Redis mais consistente e performática quando a carga e a quantidade de acessos é variado.

Por fim, clique em Schedule update e configure os dias e horários autorizados para realização de manutenção e atualização do Redis, isso evita que você receba algum erro em produção no meio do dia devido a manutenção automática do Redis. No meu caso eu configurei todo domingo às 4h da manhã (1h UTC).

Para maior informações e melhores práticas com o Azure Redis, siga o link abaixo:

https://docs.microsoft.com/pt-br/azure/azure-cache-for-redis/cache-best-practices

Redis e .NET 5

Neste exemplo utilizaremos o package StackExchange.Redis para operações de cache distribuído e mensageria (publish-subscribe) e o package nativo do .NET 5 Microsoft.Extensions.DependencyInjection para cache em memória.

O armazenamento de cache em memória refere-se ao armazenamento de dados acessados com frequência na memória do aplicativo, o que funciona perfeitamente bem para carregamentos de aplicações individuais. Uma desvantagem disso é que o cache é interno a um único nó da aplicação e esse cache é limpo quando a aplicação é reiniciada em qualquer evento. Essa abordagem também não funciona bem na ideia de ambientes com balanceamento de carga, onde uma solicitação pode ser tratada por mais de um nó do servidor.

No mecanismo de cache distribuído, o cache é mantido externo aos nós do aplicativo como um componente distribuído individual e os aplicativos podem acessar esses nós de cache com tempos de leitura elevados.

O primeiro passo é configurar o cache em memória e o cache distribuído na classe startup.cs da API de exemplo, conforme código abaixo:

Configure sua connection string do Redis conforme o padrão abaixo, informando o timeout e quantidade de retry de conexão:

Tanto o cache em memória como o cache distribuído utilizarão a mesma interface de implementação, adicionando um método a mais no cache distribuído para publicação de mensagem (pub-sub). A implementação do cache em memória fica assim:

A implementação do cache distribuído com o método de publicação da mensagem fica assim:

O último passo é configurar o Worker Service (BackgroudService) do nosso exemplo para receber as mensagens publicadas pela API Exemplo.

Com seu Worker Service criado é necessário configurar a classe program.cs com o acesso ao Redis, conforme o código abaixo:

E por fim, configure o Worker para receber as mensagens (subscribe):

Baixando o projeto de exemplo informado no final deste artigo, é possível testar via swagger as operações mais importantes de utilização do cache.

Com esse exemplo é possível entender como funciona o cache em memória, distribuído (Redis) e envio e recebimento de mensagens com o publish -subscribe do próprio Redis.

O exemplo de utilização do Azure Redis Cache e do cache em memória em .NET 5, você confere no link do meu github:

https://github.com/hgmauri/sample-redis-cache

Deixe uma resposta