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:
- Solicitudes duplicadas a la base de datos
- Reducción de tasa de acietros en caché
- 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));
- 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);
}
- 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");
- ZSet: Conjunto ordenado con puntuación
- 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.