Almacenamiento en caché en C#: Redis, Memcached y soluciones integradas
El almacenamiento en caché es una de las herramientas clave para optimizar el rendimiento en aplicaciones web modernas. En el ecosistema C# (.NET), los desarrolladores tienen acceso tanto a mecanismos integrados (IMemoryCache, IDistributedCache) como a potentes soluciones externas (Redis, Memcached). En este artículo analizaremos sus características, compararemos el rendimiento y proporcionaremos ejemplos prácticos de código.
1. Soluciones integradas de .NET: IMemoryCache e IDistributedCache
ASP.NET Core proporciona dos interfaces principales para trabajar con caché: IMemoryCache (caché local en memoria de un solo proceso) e IDistributedCache (abstracción para caché distribuido).
IMemoryCache
Ideal para aplicaciones monolíticas o microservicios donde no se requiere sincronización entre instancias. El caché se almacena en la memoria RAM del servidor.
// Registro en Program.csbuilder.Services.AddMemoryCache();
// Uso en el serviciopublic class DataService{ private readonly IMemoryCache _cache;
public DataService(IMemoryCache cache) { _cache = cache; }
public async Task<string> GetExpensiveDataAsync(int id) { string cacheKey = $"data_{id}"; if (_cache.TryGetValue(cacheKey, out string cachedData)) { return cachedData; }
// Emulación de operación pesada await Task.Delay(500); string data = $"Result for {id}";
var options = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromMinutes(10)) .SetSlidingExpiration(TimeSpan.FromMinutes(2));
_cache.Set(cacheKey, data, options); return data; }}IDistributedCache
Abstracción que permite conectar diferentes backends (Redis, SQL Server, NCache) sin cambiar el código de la aplicación. Se registra mediante AddDistributedRedisCache o AddDistributedSqlServerCache.
// Ejemplo con Redisbuilder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "SampleInstance";});
// Usopublic class DistributedService{ private readonly IDistributedCache _cache;
public DistributedService(IDistributedCache cache) { _cache = cache; }
public async Task<string> GetDataAsync(string key) { var cached = await _cache.GetStringAsync(key); if (cached != null) return cached;
var data = $"Computed at {DateTime.Now}"; await _cache.SetStringAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5) }); return data; }}2. Redis: potente caché distribuido para C#
Redis es un almacén de datos en memoria con soporte para estructuras complejas (listas, conjuntos, hashes). Para .NET se utiliza el cliente StackExchange.Redis o el envoltorio de alto nivel Microsoft.Extensions.Caching.StackExchangeRedis.
Ventajas de Redis en C#:
- Velocidad: latencias de submilisegundo (promedio 0.5-1 ms).
- Pub/Sub: permite notificar a otros servicios sobre cambios en el caché.
- Persistencia: los datos pueden guardarse en disco (RDB/AOF).
- Clustering: escalado horizontal listo para usar.
Ejemplo de uso avanzado con serialización JSON:
using StackExchange.Redis;using System.Text.Json;
public class RedisCacheService{ private readonly IDatabase _db; private readonly ConnectionMultiplexer _redis;
public RedisCacheService(string connectionString) { _redis = ConnectionMultiplexer.Connect(connectionStri