Cache Avançado em C#: Redis, Memcached e Soluções Integradas

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

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