Caché en C#: Redis, Memcached y soluciones integradas para .NET

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Blogs

Book Recommendations