Caché en C# (.NET): Redis, MemoryCache y otras soluciones

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

Caché en C# (.NET): Redis, MemoryCache y otras herramientas



En las aplicaciones modernas de alta carga en C# (.NET), el almacenamiento en caché es uno de los mecanismos clave para mejorar el rendimiento y reducir la carga en las bases de datos. En este artículo, analizaremos en detalle las principales herramientas de caché en el ecosistema .NET: el MemoryCache integrado, la caché distribuida basada en Redis a través de la biblioteca StackExchange.Redis, así como la abstracción IDistributedCache.



1. Caché integrado: MemoryCache



MemoryCache (espacio de nombres Microsoft.Extensions.Caching.Memory) es la forma más sencilla de almacenar datos en caché directamente en la memoria RAM del proceso. Es ideal para aplicaciones de un solo proceso (por ejemplo, ASP.NET Core sin escalado).



Ejemplo de uso básico:



using Microsoft.Extensions.Caching.Memory;

// Creación de la cachéIMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

// Escritura en caché con tiempo de vida de 5 minutoscache.Set("user:123", new User { Id = 123, Name = "Iván" }, TimeSpan.FromMinutes(5));

// Lectura desde la cachéif (cache.TryGetValue("user:123", out User user)){ Console.WriteLine($"Usuario: {user.Name}");}else{ Console.WriteLine("Caché vacía, cargando desde la BD...");}


Ventajas: velocidad máxima, latencia de red cero, facilidad de configuración.
Desventajas: los datos solo existen en un proceso, se pierden al reiniciar la aplicación.



2. Caché distribuida: Redis + StackExchange.Redis



Para sistemas distribuidos (varios servidores, microservicios) se necesita una caché externa. Redis es la opción más popular. La biblioteca principal para trabajar con Redis en .NET es StackExchange.Redis (más de 6 mil estrellas en GitHub).



Instalación:



dotnet add package StackExchange.Redis


Ejemplo de trabajo con Redis:



using StackExchange.Redis;

// Conexión a RedisConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();

// Escritura de cadena con TTL (tiempo de vida)db.StringSet("session:token123", "user_data_here", TimeSpan.FromHours(1));

// Lecturastring data = db.StringGet("session:token123");if (!string.IsNullOrEmpty(data)){ Console.WriteLine($"Datos desde la caché: {data}");}

// Almacenamiento en caché de objetos complejos (serialización a JSON)var product = new Product { Id = 1, Name = "Portátil", Price = 75000 };string json = System.Text.Json.JsonSerializer.Serialize(product);db.StringSet("product:1", json, TimeSpan.FromMinutes(10));

// Deserialización al leerstring cachedJson = db.StringGet("product:1");var cachedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(cachedJson);


Funcionalidades adicionales de Redis:

  • Hashes — para almacenar objetos con campos (por ejemplo, perfil de usuario).
  • Listas y conjuntos — para colas, clasificaciones.
  • Pub/Sub — para notificaciones de invalidación de caché.
  • Scripts Lua — operaciones atómicas.


3. Abstracción IDistributedCache



Microsoft proporciona la interfaz IDistributedCache (paquete Microsoft.Extensions.Caching.Abstractions), que permite cambiar entre diferentes implementaciones de caché sin modificar el código de la aplicación.



Implementaciones:

  • MemoryDistributedCache — para desarrollo y pruebas (almacena en memoria).
  • RedisCache (paquete Microsoft.Extensions.Caching.StackExchangeRedis) — para producción.
  • SqlServerCache

Recommendations