Caché avanzado en C#: Redis, Memcached y soluciones integradas

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

Introducción: Por qué el caché avanzado lo cambia todo

En la arquitectura moderna de alta carga, la velocidad de respuesta y la reducción de la carga en la base de datos son tareas clave. El caché en C# (.NET) ha dejado de ser simplemente recordar un resultado: es un sistema complejo de gestión del estado, tiempo de vida y consistencia de los datos. A nivel avanzado, el desarrollador debe elegir entre Redis, Memcached y soluciones integradas según el escenario.

En este artículo analizaremos tres enfoques principales de caché en el ecosistema .NET, compararemos su rendimiento, complejidad de implementación y errores típicos. Aprenderá cómo configurar un caché distribuido con Redis, optimizar Memcached para altas cargas y cuándo el IMemoryCache integrado es la mejor solución.



Caché integrado en .NET: IMemoryCache e IDistributedCache

IMemoryCache — caché local rápido

El caché integrado IMemoryCache del espacio de nombres Microsoft.Extensions.Caching.Memory es la solución ideal para una sola instancia de la aplicación. Almacena datos en la memoria RAM del proceso, proporcionando una latencia mínima.

// Registro en Startup.cs o Program.csbuilder.Services.AddMemoryCache();

// Uso en un serviciopublic 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; }}

Ventajas: latencia de red cero, configuración sencilla, soporte de expiración deslizante y absoluta.

Desventajas: no funciona al escalar a varios servidores; limitado por la RAM del proceso.



IDistributedCache — abstracción para cachés distribuidos

La interfaz IDistributedCache permite cambiar fácilmente entre Redis, SQL Server o NCache sin modificar la lógica de negocio. La implementación predeterminada es MemoryDistributedCache (local), pero para producción normalmente se elige Redis.

// Registro de la implementación 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) });}

La ventaja clave es la unificación: escribes el código una vez y el proveedor de caché se cambia mediante configuración.



Redis en C#: técnicas y patrones avanzados

Conexión y pool de conexiones

Para trabajar con Redis en .NET se utiliza la biblioteca StackExchange.Redis. En lugar de crear una nueva conexión cada vez, use multiplexación: una sola conexión para toda la aplicación.

// Singleton globalpublic static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379,abortConnect=false");

// Obtener la base de datosIDatabase db = redis.GetDatabase(0);

// Operaciones básicasawait db.StringSetAsync("user:1", "John Doe", TimeSpan.FromMinutes(30));string name = await db.StringGetAsync("user:1");

Blogs

Book Recommendations