ASP.NET Core 2.0: implementando cache em APIs REST

Partindo do armazenamento temporário de informações para consumo posterior, a utilização de cache é uma prática mais do que comum em aplicações Web que buscam uma maior performance. APIs REST não fogem a esta regra, sendo que no caso específico do ASP.NET Core temos a possibilidade de implementação de técnicas de caching empregando diferentes alternativas: em memória, distribuído com Redis (solução NoSQL open source) ou através de uma base do SQL Server.

As próximas seções deste artigo trazem exemplos de uso destas 3 opções em APIs construídas com o ASP.NET Core 2.0.


Implementando cache em memória

Alternativa recomendada para cenários mais simples, a implementação de cache em memória com o ASP.NET Core está baseada na utilização da interface IMemoryCache (namespace Microsoft.Extensions.Caching.Memory).

Para ativar esta opção será necessário acionar a operação AddMemoryCache dentro do método ConfigureServices na classe Startup:

Na listagem a seguir é possível observar uma instância do tipo IMemoryCache em uso:

  • O método genérico GetOrCreate possibilita a obtenção de um valor armazenado em cache e que esteja associado a uma chave informada anteriormente;
  • Caso o elemento em questão ainda não exista no cache serão executadas as instruções definidas como parâmetro em GetOrCreate;
  • Para este exemplo específico foi utilizada uma string JSON contendo cotações de moedas estrangeiras e que ficará disponível durante 30 segundos (o uso de SetAbsoluteExpiration indica que a contagem do tempo iniciará tão logo se inclua um item no cache).

Implementando cache distribuído com Redis

As restrições decorrentes do uso da memória para armazenamento de dados (estados inconsistentes quando há múltiplas instâncias de uma mesma aplicação, limitações de hardware) podem ser superadas através da adoção de mecanismos de cache distribuído. Uma solução deste tipo bastante popular no desenvolvimento Web (incluindo APIs REST) é o Redis, alternativa NoSQL open source que oferece uma excelente performance.

Para a utilização do Redis em aplicações baseadas no ASP.NET Core deverá ser utilizada a interface IDistributedCache (namespace Microsoft.Extensions.Caching.Distributed).

A ativação também envolverá ajustes no método ConfigureServices da classe Startup, por meio de uma chamada à operação AddDistributedRedisCache (a qual receberá como parâmetro uma string de conexão para uso do Redis):

O próximo exemplo é bastante similar àquele apresentado na seção anterior (e que fazia uso de cache em memória), diferindo apenas pela utilização de instâncias de IDistributedCache:

  • Através de uma referência do tipo DistributedCacheEntryOptions (namespace Microsoft.Extensions.Caching.Distributed) será definido um tempo de 2 minutos para o armazenamento de uma string JSON;
  • Os métodos GetString e SetString permitem a recuperação e gravação de strings em cache.

Na imagem a seguir é possível observar a string gerada a partir de CotacoesController já em cache (a ferramenta em questão é o Redis Desktop Manager, utilitário gratuito de gerenciamento desta tecnologia NoSQL):


Implementando cache distribuído em bases SQL Server

Uma alternativa ao uso do Redis, embora menos performática, seria o uso do SQL Server como meio de armazenamento para informações de cache. Instâncias da interface IDistributedCache também serão utilizadas nesta situação, com a única diferença significativa acontecendo nas configurações em ConfigureServices na classe Startup:

  • Será acionado o método AddDistributedSqlServerCache para ativar a gravação de dados de cache em uma base do SQL Server;
  • Dentre as informações configuradas a partir de AddDistributedSqlServerCache estão a string de conexão, o schema e o nome da tabela que conterá o cache.

A estrutura esperada para a tabela dbo.DadosCache está na próxima listagem:

Já na imagem seguinte vemos esta mesma tabela com dados de armazenamento temporário:


Os diferentes exemplos abordados neste artigo já foram disponibilizados também no GitHub:

https://github.com/renatogroffe/ASPNETCore2_APIs_Cache

https://github.com/renatogroffe/ASPNETCore2_API_Cache_SQLServer