Volver a Redis Básico
Strings y Hashes en Redis
Operaciones Avanzadas con Strings
# GETSET — obtener y establecer de forma atómica
GETSET contador 0 # retorna valor antiguo, establece nuevo
# GETDEL — obtener y eliminar
GETDEL clave_temporal
# APPEND
SET saludo "Hola"
APPEND saludo ", Mundo!"
GET saludo # "Hola, Mundo!"
# STRLEN
STRLEN saludo # 12
# GETRANGE / SETRANGE (subcadenas)
GETRANGE saludo 0 3 # "Hola"
SETRANGE saludo 6 "Redis"
# Operaciones de bits (usuarios activos, flags de características)
SETBIT usuario:flags:1001 0 1 # bit 0 = "email_verificado"
GETBIT usuario:flags:1001 0 # 1
BITCOUNT usuario:flags:1001 # contar bits activados
Hashes — Almacenar Objetos
# Establecer campos
HSET usuario:1001 nombre "Alicia" email "[email protected]" edad 30
# Obtener un campo
HGET usuario:1001 nombre # "Alicia"
# Obtener todos los campos
HGETALL usuario:1001
# { nombre: "Alicia", email: "[email protected]", edad: "30" }
# Obtener varios a la vez
HMGET usuario:1001 nombre email
# Verificar existencia
HEXISTS usuario:1001 telefono # 0 (no existe)
# Eliminar campo
HDEL usuario:1001 edad
# Incrementar campo numérico
HINCRBY producto:42 vistas 1
HINCRBYFLOAT producto:42 calificacion 0.5
# Claves / valores / longitud
HKEYS usuario:1001
HVALS usuario:1001
HLEN usuario:1001 # 2
Ejemplo con Node.js / ioredis
import Redis from 'ioredis';
const redis = new Redis({
host: 'localhost',
port: 6379,
password: 'tupassword'
});
// Almacenar usuario como hash
await redis.hset('usuario:1001', {
nombre: 'Alicia',
email: '[email protected]',
rol: 'admin'
});
// Recuperar todos los campos
const usuario = await redis.hgetall('usuario:1001');
console.log(usuario); // { nombre: 'Alicia', email: '...', rol: 'admin' }
// Actualización atómica con TTL (pipeline)
const pipeline = redis.pipeline();
pipeline.hset('usuario:1001', 'ultimaVisita', Date.now());
pipeline.expire('usuario:1001', 86400);
await pipeline.exec();
Patrón de Caché con Hashes
async function obtenerUsuario(userId: string) {
const cacheKey = `usuario:${userId}`;
const cached = await redis.hgetall(cacheKey);
if (Object.keys(cached).length > 0) return cached;
const usuario = await db.query('SELECT * FROM usuarios WHERE id = ?', [userId]);
await redis.hset(cacheKey, usuario);
await redis.expire(cacheKey, 3600);
return usuario;
}
Comparación Hash vs String
| String (JSON) | Hash | |
|---|---|---|
| Almacenar objeto | SET key '{"nombre":"Alicia"}' | HSET key nombre Alicia |
| Actualizar 1 campo | Leer, parsear, modificar, serializar | HSET key nombre Roberto |
| Actualización parcial | ❌ | ✅ |
| Memoria | Menos overhead | Compacto para pocos campos |