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.RedisExemplo 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(pacoteMicrosoft.Extensions.Caching.StackExchangeRedis) — para produção.SqlServerCache