Cache em C# (.NET): Redis, MemoryCache e outras soluções

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cache em C# (.NET): Redis, MemoryCache e outras ferramentas



Em aplicações modernas de alta carga em C# (.NET), o cache é um dos mecanismos-chave para melhorar o desempenho e reduzir a carga no banco de dados. Neste artigo, abordaremos detalhadamente as principais ferramentas de cache no ecossistema .NET: o MemoryCache embutido, o cache distribuído baseado em Redis através da biblioteca StackExchange.Redis, e a abstração IDistributedCache.



1. Cache embutido: MemoryCache



MemoryCache (namespace Microsoft.Extensions.Caching.Memory) é a forma mais simples de armazenar dados em cache diretamente na memória RAM do processo. Ideal para aplicações de processo único (ex.: ASP.NET Core sem escalonamento).



Exemplo de uso básico:



using Microsoft.Extensions.Caching.Memory;

// Criando o cacheIMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

// Gravando no cache com tempo de vida de 5 minutoscache.Set("user:123", new User { Id = 123, Name = "João" }, TimeSpan.FromMinutes(5));

// Lendo do cacheif (cache.TryGetValue("user:123", out User user)){ Console.WriteLine($"Usuário: {user.Name}");}else{ Console.WriteLine("Cache vazio, carregando do BD...");}


Vantagens: velocidade máxima, latência de rede zero, simplicidade de configuração.
Desvantagens: os dados existem apenas em um único processo, são perdidos ao reiniciar a aplicação.



2. Cache distribuído: Redis + StackExchange.Redis



Para sistemas distribuídos (vários servidores, microsserviços), é necessário um cache externo. Redis é a escolha mais popular. A principal biblioteca para trabalhar com Redis no .NET é StackExchange.Redis (mais de 6 mil estrelas no GitHub).



Instalação:



dotnet add package StackExchange.Redis


Exemplo de trabalho com Redis:



using StackExchange.Redis;

// Conectando ao RedisConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();

// Gravando string com TTL (tempo de vida)db.StringSet("session:token123", "user_data_here", TimeSpan.FromHours(1));

// Lendostring data = db.StringGet("session:token123");if (!string.IsNullOrEmpty(data)){ Console.WriteLine($"Dados do cache: {data}");}

// Cache de objetos complexos (serialização em JSON)var product = new Product { Id = 1, Name = "Notebook", Price = 75000 };string json = System.Text.Json.JsonSerializer.Serialize(product);db.StringSet("product:1", json, TimeSpan.FromMinutes(10));

// Desserialização ao lerstring cachedJson = db.StringGet("product:1");var cachedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(cachedJson);


Recursos adicionais do Redis:

  • Hashes — para armazenar objetos com campos (ex.: perfil de usuário).
  • Listas e conjuntos — para filas, rankings.
  • Pub/Sub — para notificações de invalidação de cache.
  • Scripts Lua — operações atômicas.


3. Abstração IDistributedCache



A Microsoft fornece a interface IDistributedCache (pacote Microsoft.Extensions.Caching.Abstractions), que permite alternar entre diferentes implementações de cache sem alterar o código da aplicação.



Implementações:

  • MemoryDistributedCache — para desenvolvimento e testes (armazena em memória).
  • RedisCache (pacote Microsoft.Extensions.Caching.StackExchangeRedis) — para produção.
  • SqlServerCache

Recommendations