Usando Azure Redis Cache no ASP.NET Core
Como 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:
Espero que tenham gostado.
Maiores informações em:
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