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:

 

pic01a

 

Na tela "New Redis Cache" é necessário informar o nome do cache que irá compor o DNS, qual a assinatura utilizada, o resource group (eu estou usando o mesmo criado para a aplicação), o datacenter e o plano, conforme:

pic02

 

Uma vez que o Azure Redis está configurado, agora é necessário adicionar a referência ao pacote NuGet Microsoft.Extensions.Caching.Redis.Core na aplicação. Essa referência pode ser adicionada via NuGet Package Manager:

 

redis1

 

Ou pode ser adicionada diretamente no arquivo project.json dentro da tag dependencies:

  "Microsoft.Extensions.Caching.Redis.Core": "1.0.2"

 

Após adicionar a referência, verifique se a mesma foi incluída com sucesso ao projeto:

 

ref

 

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.

 

Voltando à configuração 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": "myapponcloud.redis..."
}

 

O arquivo completo ficaria da seguinte forma:

 

appsettings

 

 

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:

 

rediskeys1

 

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();
}

 

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>Actual value is:</li>
@ViewData["ActualTime"]
</ul>

 

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

 

view

 

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:
Comments (0)

Skip to main content