Caching en C# (.NET): Redis, MemoryCache y alternativas
El caching es una de las herramientas clave para mejorar el rendimiento de las aplicaciones en C# (.NET). Permite reducir el tiempo de respuesta, disminuir la carga en las bases de datos y reducir los costos de infraestructura. En este artículo analizaremos los mecanismos integrados de .NET, las implementaciones populares basadas en Redis, así como soluciones alternativas como NCache y Couchbase.
1. Caching integrado: MemoryCache
MemoryCache (espacio de nombres Microsoft.Extensions.Caching.Memory) es una caché simple y rápida que almacena datos en la memoria RAM de un solo proceso. Es ideal para aplicaciones de un solo hilo o servidores web con una sola instancia.
Instalación y configuración
dotnet add package Microsoft.Extensions.Caching.MemoryEjemplo 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; }}Ventajas y desventajas
- + Simplicidad, latencia de red cero.
- + Soporte integrado para caducidad (absoluta/deslizante).
- - No funciona al escalar a múltiples servidores.
- - Al reiniciar la aplicación, la caché se borra.
2. Caching distribuido: Redis
Redis es la opción más popular para el caching distribuido en el ecosistema .NET. Funciona como un servicio independiente accesible para todas las instancias de la aplicación. En .NET se utiliza la abstracción IDistributedCache.
Instalación del paquete
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedisConfiguración en Program.cs
builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "MyAppCache";});Ejemplo de trabajo con 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 avanzadas de Redis
- Serialización de objetos: use
System.Text.JsonoNewtonsoft.Json. - Invalidación por etiquetas: bibliotecas de terceros (por ejemplo,
EasyCaching.Redis) permiten agrupar registros. - Pub/Sub: para notificaciones de cambios en la caché.
3. Alternativas a Redis
3.1 NCache
NCache es una solución comercial (con versión gratuita) compatible con .NET. Ofrece funcionalidades avanzadas: sincronización entre nodos, consultas similares a SQL en la caché, almacenamiento en caché de sesiones ASP.NET.
- + Soporte integrado para
IDist