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 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.Memory


Exemplo 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.StackExchangeRedis


Configuraçã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.Json ou Newtonsoft.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

Recommendations