Redis como Middleware de Caché

Introducción a Redis

Redis (REmote DIctionary Server) es una base de datos clave-valor no relacional, desarrollada en ANSI C. Es multiplataforma, de código abierto, compatible con redes y ofrece almacenamiento en memoria con persistencia opcional. Destaca por:

  • Escalabilidad flexible
  • Alto rendimiento con grandes volúmenes
  • Ocho estructuras de datos entegradas
  • Almacenamiento distribuido

Casos de Uso

En arquitecturas distribuidas con balanceadores de carga, el caché local en instancias individuales causa problemas:

  1. Solicitudes duplicadas a la base de datos
  2. Reducción de tasa de acietros en caché
  3. Saturación de recursos en alta concurrencia

Redis resuelve estos problemas mediante un caché centralizado que optimiza lecturas/escrituras (CPU > memoria > disco).

Modelo de Comunicación

Hilos Únicos vs Múltiples

  • Hilo único: Operaciones atómicas sin bloqueos
  • Hilos múltiples: Requieren sincronización (locks) con sobrecarga de contexto

Multiplexación I/O

Técnica que gestiona múltiples operaciones en un solo hilo:

  • Select (Windows): Escaneo secuencial de descriptores, degrada con conexiones crecientes
  • Epoll (Linux): Notificaciones por eventos, mantiene rendimiento con alta concurrencia

Estructuras de Datos

Configuración en .NET

public static IServiceCollection AddRedis(
    this IServiceCollection services, string connection) {
    
    var config = ConfigurationOptions.Parse(connection);
    var multiplexer = ConnectionMultiplexer.Connect(config);
    services.AddSingleton(multiplexer);
    return services;
}

// Inyección en Startup
services.AddRedis("localhost:6379,connectTimeout=2000");

Tipos Principales

  • String: Almacena hasta 512MB (texto, JSON, binarios)
var userJson = JsonSerializer.Serialize(user);
database.StringSet("user:1", userJson, expiry: TimeSpan.FromMinutes(5));
  1. Set: Colección no ordenada sin duplicados
var items = database.SetMembers("inventory");
if (!items.Any()) {
    var stock = StockService.GetItems();
    var serialized = stock.Select(JsonSerializer.Serialize).ToArray();
    database.SetAdd("inventory", serialized);
}
  1. Hash: Mapa de campos-valor
var lastAccess = database.HashGet("session:status", "last_access");
if (lastAccess.IsNull) {
    database.HashSet("session:status", "last_access", DateTime.UtcNow);
}
database.HashIncrement("session:status", "access_count");
  1. ZSet: Conjunto ordenado con puntuación
  2. List: Secuencia ordenada para colas/pilas

Transacciones

var transaction = database.CreateTransaction();
transaction.StringSetAsync("temp:data", "pending");
if (transaction.Execute()) {
    // Operación exitosa
} else {
    // Fallo por modificación concurrente
}

Persistencia

RDB (Snapshotting)

  • BGSAVE: Copia en segundo plano sin bloquear
  • SAVE: Bloquea el servidor durante la copia
# Configuración
save 300 10    # Guardar tras 10 cambios en 5 minutos
rdbcompression yes
dbfilename backup.rdb

AOF (Append-Only File)

appendonly yes
appendfilename "operations.aof"
appendfsync everysec   # Sincronización cada segundo

Carga de Persistencia

Redis prioriza AOF si está habilitado; de lo contrario, usa RDB.

Etiquetas: Redis cache Distributed Systems estructuras de datos StackExchange.Redis

Publicado el 7-2 02:38