Cache em C# (.NET): Redis, MemoryCache e alternativas
Cache é uma das ferramentas-chave para melhorar o desempenho de aplicações em C# (.NET). Ele permite reduzir o tempo de resposta, diminuir a carga nos bancos de dados e reduzir custos de infraestrutura. Neste artigo, abordaremos os mecanismos nativos do .NET, implementações populares baseadas em Redis, além de soluções alternativas como NCache e Couchbase.
1. Cache nativo: MemoryCache
MemoryCache (namespace Microsoft.Extensions.Caching.Memory) é um cache simples e rápido que armazena dados na memória RAM de um único processo. É ideal para aplicações single-thread ou servidores web com uma única instância.
Instalação e configuração
dotnet add package Microsoft.Extensions.Caching.MemoryExemplo de uso básico
using Microsoft.Extensions.Caching.Memory;
public class DataService{ private readonly IMemoryCache _cache; private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5);
public DataService(IMemoryCache cache) => _cache = cache;
public async Task<string> GetDataAsync(string key) { if (!_cache.TryGetValue(key, out string cachedData)) { cachedData = await FetchFromDatabaseAsync(key); _cache.Set(key, cachedData, new MemoryCacheEntryOptions { AbsoluteExpirationRelativeToNow = _cacheDuration }); } return cachedData; }}Vantagens e desvantagens
- + Simplicidade, latência de rede zero.
- + Suporte nativo a expiração (absoluta/deslizante).
- - Não funciona ao escalar para vários servidores.
- - O cache é limpo ao reiniciar a aplicação.
2. Cache distribuído: Redis
Redis é a escolha mais popular para cache distribuído no ecossistema .NET. Ele funciona como um serviço separado, acessível a todas as instâncias da aplicação. No .NET, utiliza-se a abstração IDistributedCache.
Instalação do pacote
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedisConfiguração no Program.cs
builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "MyAppCache";});Exemplo de uso com IDistributedCache
public class RedisCacheService{ private readonly IDistributedCache _cache;
public RedisCacheService(IDistributedCache cache) => _cache = cache;
public async Task SetAsync(string key, byte[] data, int minutes = 10) { await _cache.SetAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes) }); }
public async Task<byte[]> GetAsync(string key) { return await _cache.GetAsync(key); }}Funcionalidades avançadas do Redis
- Serialização de objetos: use
System.Text.JsonouNewtonsoft.Json. - Invalidação por tags: bibliotecas de terceiros (ex.:
EasyCaching.Redis) permitem agrupar registros. - Pub/Sub: para notificações sobre alterações no cache.
3. Alternativas ao Redis
3.1 NCache
NCache é uma solução comercial (com versão gratuita) com suporte a .NET. Oferece recursos avançados: sincronização entre nós, consultas SQL-like ao cache, cache de sessões ASP.NET.
- + Suporte nativo a
IDist
Também na biblioteca
PHPMailer para PHP: guia completo com exemplos
ORM para Rust: comparação e exemplos de uso de Diesel, SeaORM e SQLx
Internacionalização (i18n) em Kotlin: Guia Completo com Exemplos
Cliente OAuth para PHP: integração com Google, GitHub e VK
Lodash para JavaScript (Node.js): guia completo com exemplos