Introdução: Por que o cache avançado muda tudo
Na arquitetura moderna de alta carga, a velocidade de resposta e a redução da carga no banco de dados são tarefas essenciais. O cache em C# (.NET) deixou de ser apenas o armazenamento de resultados: é um sistema complexo de gerenciamento de estado, tempo de vida e consistência de dados. Em nível avançado, o desenvolvedor deve escolher entre Redis, Memcached e soluções integradas, dependendo do cenário.
Neste artigo, abordaremos três abordagens principais para cache no ecossistema .NET, compararemos seu desempenho, complexidade de implementação e erros típicos. Você aprenderá como configurar um cache distribuído com Redis, otimizar o Memcached para altas cargas e quando o IMemoryCache integrado é a melhor solução.
Cache integrado no .NET: IMemoryCache e IDistributedCache
IMemoryCache — cache local rápido
O cache integrado IMemoryCache do namespace Microsoft.Extensions.Caching.Memory é a solução ideal para uma única instância de aplicação. Ele armazena dados na memória RAM do processo, garantindo latência mínima.
// Registro em Startup.cs ou Program.csbuilder.Services.AddMemoryCache();
// Uso em um serviçopublic class ProductService{ private readonly IMemoryCache _cache;
public ProductService(IMemoryCache cache) { _cache = cache; }
public async Task<Product> GetProductAsync(int id) { string cacheKey = $"product_{id}"; if (!_cache.TryGetValue(cacheKey, out Product product)) { product = await _repository.GetProductByIdAsync(id); var cacheEntryOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromMinutes(5)) .SetSlidingExpiration(TimeSpan.FromMinutes(1)) .SetPriority(CacheItemPriority.High);
_cache.Set(cacheKey, product, cacheEntryOptions); } return product; }}Vantagens: latência de rede zero, configuração simples, suporte a expiração deslizante e absoluta.
Desvantagens: não funciona ao escalar para vários servidores; limitado pela RAM do processo.
IDistributedCache — abstração para caches distribuídos
A interface IDistributedCache permite alternar facilmente entre Redis, SQL Server ou NCache sem alterar a lógica de negócios. A implementação padrão é MemoryDistributedCache (local), mas para produção geralmente se escolhe Redis.
// Registro da implementação Redisbuilder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "SampleInstance";});
// Usopublic async Task SetCacheAsync(string key, byte[] data){ var cache = context.RequestServices.GetRequiredService<IDistributedCache>(); await cache.SetAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1) });}A principal vantagem é a unificação: você escreve o código uma vez e o provedor de cache é alterado via configuração.
Redis em C#: técnicas e padrões avançados
Conexão e pool de conexões
Para trabalhar com Redis no .NET, utiliza-se a biblioteca StackExchange.Redis. Em vez de criar uma nova conexão a cada vez, use multiplexação — uma única conexão para toda a aplicação.
// Singleton globalpublic static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379,abortConnect=false");
// Obtendo o banco de dadosIDatabase db = redis.GetDatabase(0);
// Operações básicasawait db.StringSetAsync("user:1", "John Doe", TimeSpan.FromMinutes(30));string name = await db.StringGetAsync("user:1");
Blogs
Book Recommendations
Leia também
Go vs Python para backend: comparação prática em 2024
Tratamento de erros em Java: do try/catch às técnicas avançadas
Cache em Swift: Redis, Memcached e soluções nativas para iOS/macOS
Salários de desenvolvedores Go na Rússia: visão geral do mercado para avançados
C# para aprendizado de máquina: possibilidades, limitações e exemplos de código