Usando Azure Redis Cache no ASP.NET Core

redisComo vocês sabem o uso de cache pode aumentar o desempenho das aplicações ao armazenar dados estratégicos em memória ao invés de ter que obter novamente para toda requisição. Muitas vezes, essas informações podem degradar o tempo de resposta da aplicação por serem provenientes de recursos externos ao da aplicação como banco de dados ou serviços.

Nesse post, eu vou mostrar como utilizar o Azure Redis Cache que permite o uso de cache em servidores distribuídos, possibilitando que o cache seja compartilhado em mais de um servidor. O Azure Redis utiliza o framework open-source Redis para implementar o cache distribuído.

Para exemplificar o uso do Redis eu vou utilizar a aplicação MyAppOnCloud, criada no post Usando ASP.NET Core na Nuvem, e publicada em 3 datacenters.

 

O primeiro passo é criar o serviço de cache. No Portal do Azure , crie um novo Redis Cache conforme as instruções na imagem a seguir:

 

Na tela "New Redis Cache" é necessário informar o nome do cache que irá compor o DNS, qual a assinatura utilizada, o resource group, datacenter, plano de consumo e clicar no botão Create:

O próximo passo é criar o projeto no Visual Studio 2017:

 

 

Eu selecionei o template MVC:

 

 

 

Agora é necessário adicionar a referência ao pacote NuGet Microsoft.Extensions.Caching.Redis  na aplicação. Essa referência pode ser adicionada via NuGet Package Manager:

 

Selecione browse e clique na opção include prerelease:

 

 

 

Agora é necessário adicionar o seguinte código ao método ConfigureServices da classe startup.cs para configurar o acesso ao serviço de cache Redis.

 
services.AddDistributedRedisCache(option => 
       { 
            option.Configuration = Configuration.GetConnectionString("RedisConnection"); 
            option.InstanceName = "master"; 
       });

 

O método AddDistributedRedisCache, além de configurar o serviço, também disponibiliza a classe RegisCache via injeção de dependência (DI - Dependency Injection) em toda a parte do código que espera uma instância de objeto que implemente a interface IDistributedCache. Essa associação é realizada pela variável services do tipo IServiceCollection. Eu vou exemplificar esse conceito no momento do consumo do cache.

 

Observe que a configuração da conexão com o serviço Azure Redis é obtida através da chave de configuração RedisConnection . Nesse caso, eu adicionei a chave no arquivo appsettings.json, conforme:

 
"ConnectionStrings": {
"RedisConnection": "luisdemredis.redis.cache.windows.net:6380,password=mO0Xp…"
}

 

O arquivo completo ficaria da seguinte forma:

 

 

 

 

 

Para obter o valor da chave RedisConnection, é necessário clicar nas configurações do serviço Redis Cache do Azure, clicar em Access Key:

 

 

 E copiar o valor da chave primária, conforme

 

Agora que configuramos o serviço Redis, eu vou implementar o cache na classe HomeController. Como o serviço de cache foi adicionado no container de DI, agora a classe de cache do Redis (RedisCache) pode ser consumida em qualquer parte da aplicação através de injeção de dependência (DI - Dependency Injection).

 

Para isso, eu vou adicionar um construtor na classe HomeController para receber a instância do objeto que implementa a interface IDistributedCache. No caso, essa instância será a classe RedisCache que foi configurada através do método AddDistributedRedisCache na classe startup.

 
 
private IDistributedCache _cache;

public HomeController (IDistributedCache cache)
{
     _cache = cache;
}

E para exemplificar o consumo de uma informação de cache, eu vou adicionar o seguinte código ao método Index para obter do cache o valor da chave "Time", caso o valor não existir, um valor será adicionado ao cache:

 

 
 
 public IActionResult Index()
        {
            string value = _cache.GetString("CacheTime");

            if (value == null)
            {
                value = DateTime.Now.ToString();
                var options = new DistributedCacheEntryOptions();
                options.SetSlidingExpiration(TimeSpan.FromMinutes(1));
                _cache.SetString("CacheTime", value, options);
            }

            ViewData["CacheTime"] = value;
            ViewData["CurrentTime"] = DateTime.Now.ToString();

            return View();
        }

 

A imagem a seguir exibe o código completo:

 

 

O próximo passo é alterar a página Index (Views/Home/Index.cshtml) para obter o valor retornado do cache. No caso, como eu adicionei o valor do cache em uma ViewData, eu apenas preciso utilizá-la na página da seguinte forma:

 

<h2>Azure Redis</h2>

<ul>

<li>Value read from cache is: </li>

@ViewData["CacheTime"]

</ul>

<br />

<ul>

<li>Current value is:</li>

@ViewData["CurrentTime"]

</ul>

 

Observe que a view agora exibe os valores do cache e do horário atual obtido pela aplicação:

 

 

Observe o resultado do uso do cache, após atualizar a aplicação nos 3 datacenters que eu havia mencionado no início do post:

 

final

 

Espero que tenham gostado.

Maiores informações em:

How to Use Azure Redis Cache

Referências:

Azure: Redis Cache, Disaster Recovery to Azure, Tagging Support, Elastic Scale for SQLDB, DocDB

Working with a distributed cache

Azure Redis Cache 101 - Introduction to Redis Azure Redis Cache 102 - Application Patterns Azure Redis Cache 103 - Failover and Monitoring