Fundamentos de las bases de datos clave-valor Redis
1. ¿Cómo funcionan las bases de datos clave-valor? #
🔹 Concepto básico:
Las bases de datos clave-valor almacenan la información como un diccionario o objeto, donde cada dato tiene:
- Una clave (key): Es un identificador único, como un nombre o un ID.
- Un valor (value): Es la información almacenada, que puede ser un número, una cadena de texto, un objeto JSON o incluso un archivo.
📌 Ejemplo en la vida real
Piensa en una agenda de contactos:
- Clave: Nombre del contacto.
- Valor: Número de teléfono.
Ejemplo en Redis:
1SET contacto:juan "555-1234" 2GET contacto:juan # Devuelve "555-1234"
2. Estructura de almacenamiento en Redis y Memcached #
🔹 Redis:
- Guarda los datos en memoria RAM para mayor velocidad.
- Permite diferentes estructuras de datos (listas, hashes, conjuntos).
- Puede guardar los datos en disco para persistencia.
🔹 Memcached:
- Solo almacena pares clave-valor en memoria (sin estructuras avanzadas).
- No guarda datos en disco, solo se usa como caché.
📌 Diferencia clave: Redis es más flexible, pero Memcached es más rápido para datos pequeños y temporales.
3. Operaciones básicas en bases de datos clave-valor #
4. STRINGS (Cadenas) #
-
SET#Guarda un valor asociado a una clave.
1SET saludo "Hola mundo" -
GET#Recupera el valor de una clave.
1GET saludo # Resultado: "Hola mundo" -
INCR#Incrementa un valor numérico.
1SET visitas 1 2INCR visitas 3# Resultado: 2 -
APPEND#Añade texto al final del valor.
1APPEND saludo ", ¿cómo estas?" 2# Resultado: "Hola mundo, ¿cómo estas?" -
SETEX#Guarda un valor con tiempo de expiración.
1SETEX codigo 30 "123456" 2# Expira en 30 segundos -
EXPIRE#Establce un tiempo de expiración en segundos para una clave.
1EXPIRE codigo 30 -
PERSIST#Elimina el tiempo de expiración de una clave.
1PERSIST codigo
5. LISTS (Listas) #
Lista ordenada de elementos (como un array).
-
LPUSH/RPUSH#Inserta elementos al inicio o al final de una lista.
1LPUSH tareas "leer" 2RPUSH tareas "estudiar" -
LPOP/RPOP#Elimina y devuelve el primer/último elemento.
1LPOP tareas # Resultado: "leer" -
LRANGE#Muestra los elementos entre dos posiciones.
1LRANGE tareas 0 -1 # Lista completa -
LLEN#Longitud de la lista.
1LLEN tareas # Resultado: 1 (porque quitamos "leer")
6. SETS (Conjuntos) #
Colección no ordenada de elementos únicos (sin duplicados).
Muy útil para comprobar pertenencia y hacer operaciones de conjuntos (unión, intersección…)
-
SADD#Añade un elemento (sin duplicados).
1SADD frutas "manzana" 2SADD frutas "pera" 3SADD frutas "manzana" # No se repite -
SMEMBERS#Devuelve todos los miembros.
1SMEMBERS frutas # Resultado: "manzana", "pera" -
SISMEMBER#Comprueba si un valor existe.
1SISMEMBER frutas "pera" # Resultado: 1 (true) -
SREM#Elimina un elemento.
1SREM frutas "pera" -
SDIFF#Devuelve la diferencia entre dos conjuntos.
1SADD set1 "a" "b" "c" 2SADD set2 "b" "c" "d" 3SDIFF set1 set2 # Resultado: "a" -
SINTER#Devuelve la intersección de dos conjuntos.
1SADD set1 "a" "b" "c" 2SADD set2 "b" "c" "d" 3SINTER set1 set2 # Resultado: "b", "c"
7. ZSETS (Conjuntos ordenados) #
Como un Set, pero cada elemento tiene un score que permite ordenarlo.
Se accede por rango de valores o posiciones.
-
ZADD#Añade un valor con puntuación.
1ZADD ranking 100 "Ana" 2ZADD ranking 150 "Luis" -
ZRANGE#Devuelve elementos ordenados por puntuación (menor a mayor).
1ZRANGE ranking 0 -1 WITHSCORES -
ZREVRANGE#Orden inverso.
1ZREVRANGE ranking 0 -1 WITHSCORES -
ZINCRBY#Incrementa puntuación.
1ZINCRBY ranking 52 "Ana" 2# Ana ahora tiene 152
8. HASHES #
Almacena un conjunto de pares campo-valor.
-
HSET#Añade un campo y valor a un hash.
1HSET user:1 nombre "Lucia" 2HSET user:1 edad 30 -
HGET#Recupera un campo específico.
1HGET user:1 nombre 2# Resultado: "Lucia" -
HGETALL#Todos los campos y valores.
1HGETALL user:1 -
HDEL#Elimina un campo.
1HDEL user:1 edad -
HLEN#Devuelve el número de campos.
1HLEN user:1 2# Resultado: 1 -
HINCRBY#Incrementa un campo numérico.
1HINCRBY user:1 edad 9 2# Incrementa la edad en 9
9. BITMAPS #
Permite trabajar directamente con bits individuales (SETBIT, GETBIT).
Muy eficiente para marcar presencia/ausencia (por ejemplo, asistencia o flags).
-
SETBIT/GETBIT#Modifica y consulta bits individuales.
1SETBIT flags 2 1 2GETBIT flags 2 # Resultado: 1 -
BITCOUNT#Cuenta bits en 1.
1BITCOUNT flags # Resultado: 1
10. HYPERLOGLOG #
Estructura para contar elementos únicos de forma aproximada, pero muy eficiente en memoria.
-
PFADDyPFCOUNT#Estimación de elementos únicos.
1PFADD usuarios "juan" "ana" "luis" 2PFCOUNT usuarios 3# Resultado: 3
11. GEO #
Guarda coordenadas (latitud, longitud) para objetos.
Puedes buscar por distancia, calcular rutas, etc.
- 📦 Buscar tiendas cercanas a un usuario
- 🚕 Calcular distancia entre conductores y pasajeros
- 📍 Aplicaciones de entrega o logística
- 🛒 Mostrar resultados ordenados por cercanía
-
GEOADD#Añade ubicación geográfica.
1GEOADD ciudades 13.361389 38.115556 "Palermo" 2GEOADD ciudades 15.087269 37.502669 "Catania" -
GEODIST#Distancia entre puntos.
1GEODIST ciudades "Palermo" "Catania" km -
GEORADIUS(Redis 6 y anteriores) busca lugares cercanos a una coordenada #
Busca lugares a 200 km de la coordenada 15 37
1GEORADIUS ciudades 15 37 200 km
-
GEOPOS#
Devuelve la coordenada de una o mas localizaciones.
1GEOPOS ciudades "Palermo" "Catania"
-
GEOHASH#
Obtener hash geoespacial (no muy útil para humanos):
1GEOHASH ciudades "Palermo"
12. STREAMS #
Estructura de datos para flujos de datos (logs, eventos). Similar a un log de Kafka.
- Guarda eventos ordenados por tiempo.
- Cada evento tiene un ID único.
- Puede contener uno o varios campos con valores (tipo JSON plano).
Uso:
- 🔔 Registro de sensores
- 📈 Logs en tiempo real
- 🔄 Sistemas de colas (productores y consumidores)
- 🧪 Sistemas de mediciones continuas
-
XADD#Añade un evento al stream.
1XADD mediciones * temperatura 22- el * significa que generará el id automaticamente
-
XDEL#Elimina un mensaje por ID.
1XDEL mediciones 1689999999999-0 -
XRANGE#Muestra todos los registros.
1XRANGE mediciones - +1XRANGE mediciones - + COUNT 10- mediciones: nombre del stream.
- -: inicio del rango (- significa el primer ID disponible).
- +: fin del rango (+ significa el último ID disponible).
- COUNT 10: máximo 10 resultados (opcional pero recomendable si hay muchos datos).
-
XREAD(no siempre es soportado) #Lee eventos del stream.
1XREAD COUNT 1 STREAMS mediciones <id> 2 3XREAD STREAMS mediciones 0- COUNT 1 indica el número de elementos a leer
- id: a partir de qué ID leer. Si usas 0, leerá desde el principio. Si usas $, leerá solo los que lleguen después.
13. Trabajo con CLAVES #
-
DEL#Elimina una clave.
1DEL saludo -
EXPIRE#Tiempo de vida en segundos.
1EXPIRE codigo 30 -
TTL#Ver cuántos segundos le quedan.
1TTL codigo -
RENAME#Cambia el nombre de la clave.
1RENAME saludo saludo_nuevo -
KEYS#Lista todas las claves que coincidan.
1KEYS user:* # Muestra todas las claves que comienzan con "user:"
14. TRANSACCIONES #
-
MULTI,EXEC#Agrupa comandos que se ejecutan juntos.
1MULTI 2SET producto "camisa" 3INCR stock 4EXEC
15. PUB/SUB #
Es un sistema de mensajería en tiempo real que permite implementar el patrón de publicador/suscriptor (Publisher/Subscriber).
- Un publicador (PUBLISH) envía mensajes a un canal.
- Uno o más suscriptores (SUBSCRIBE) escuchan ese canal.
- Cada mensaje enviado se distribuye en tiempo real a todos los suscriptores conectados.
16. Persistencia y almacenamiento en memoria #
🔹 ¿Redis pierde los datos cuando se apaga?
Redis almacena los datos en memoria RAM, pero ofrece dos opciones para guardar los datos en disco:
✅ RDB (Redis Database Backup)
- Guarda copias completas de la base de datos en intervalos regulares.
- Se usa para backups.
✅ AOF (Append-Only File)
- Guarda cada operación realizada en Redis.
- Se usa para evitar pérdida de datos si el servidor se apaga.
📌 Para activar AOF, edita el archivo redis.conf y añade:
1appendonly yes
Esto garantiza que Redis registre cada cambio en un archivo de log y pueda restaurar los datos después de un reinicio.
17. Consistencia y particionamiento en Redis #
🔹 Consistencia en Redis
Redis sigue el modelo de consistencia eventual, lo que significa que los datos pueden replicarse en varios servidores y sincronizarse con el tiempo.
🔹 Particionamiento para grandes volúmenes de datos
Si tienes millones de claves, puedes dividir los datos en múltiples servidores con Redis Cluster.
1redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1
Esto permite distribuir la carga y hacer que Redis maneje grandes volúmenes de datos sin problemas.
Resumen del tema
Conceptos clave #
- Estructuras de Datos Avanzadas: Redis soporta Strings, Lists (colas/pilas), Sets (conjuntos únicos), ZSets (ordenados por puntuación), Hashes (objetos campo-valor), Bitmaps, HyperLogLog (estimaciones probabilísticas), Geoespaciales y Streams.
- Operaciones de Control y Tiempo:
EXPIREyTTLgestionan la vida útil de los datos; comandos atómicos comoINCRy transacciones conMULTI/EXECevitan condiciones de carrera. - Mensajería y Eventos: el sistema Pub/Sub (
PUBLISH/SUBSCRIBE) y los Streams permiten arquitecturas de mensajería y registros en tiempo real. - Persistencia y Escalabilidad: combina memoria RAM con persistencia en disco mediante snapshots periódicos (RDB) o registro continuo de operaciones (AOF), escalando horizontalmente con Redis Cluster.
Qué debes recordar #
Redis no es solo un almacén clave-valor simple, sino un servidor de estructuras de datos en memoria versátil, capaz de ofrecer latencias de sub-milisegundo con opciones de persistencia configurables.