Bases de datos nosql
2.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.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.
2.3. Operaciones básicas en bases de datos clave-valor
🔹 1. STRINGS (Cadenas)
-
SETGuarda un valor asociado a una clave.
1SET saludo "Hola mundo" -
GETRecupera el valor de una clave.
1GET saludo # Resultado: "Hola mundo" -
INCRIncrementa un valor numérico.
1SET visitas 1 2INCR visitas 3# Resultado: 2 -
APPENDAñade texto al final del valor.
1APPEND saludo ", ¿cómo estas?" 2# Resultado: "Hola mundo, ¿cómo estas?" -
SETEXGuarda un valor con tiempo de expiración.
1SETEX codigo 30 "123456" 2# Expira en 30 segundos -
EXPIREEstablce un tiempo de expiración en segundos para una clave.
1EXPIRE codigo 30 -
PERSISTElimina el tiempo de expiración de una clave.
1PERSIST codigo
🔹 2. LISTS (Listas)
Lista ordenada de elementos (como un array).
-
LPUSH/RPUSHInserta elementos al inicio o al final de una lista.
1LPUSH tareas "leer" 2RPUSH tareas "estudiar" -
LPOP/RPOPElimina y devuelve el primer/último elemento.
1LPOP tareas # Resultado: "leer" -
LRANGEMuestra los elementos entre dos posiciones.
1LRANGE tareas 0 -1 # Lista completa -
LLENLongitud de la lista.
1LLEN tareas # Resultado: 1 (porque quitamos "leer")
🔹 3. 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…)
-
SADDAñade un elemento (sin duplicados).
1SADD frutas "manzana" 2SADD frutas "pera" 3SADD frutas "manzana" # No se repite -
SMEMBERSDevuelve todos los miembros.
1SMEMBERS frutas # Resultado: "manzana", "pera" -
SISMEMBERComprueba si un valor existe.
1SISMEMBER frutas "pera" # Resultado: 1 (true) -
SREMElimina un elemento.
1SREM frutas "pera" -
SDIFFDevuelve la diferencia entre dos conjuntos.
1SADD set1 "a" "b" "c" 2SADD set2 "b" "c" "d" 3SDIFF set1 set2 # Resultado: "a" -
SINTERDevuelve la intersección de dos conjuntos.
1SADD set1 "a" "b" "c" 2SADD set2 "b" "c" "d" 3SINTER set1 set2 # Resultado: "b", "c"
🔹 4. ZSETS (Conjuntos ordenados)
Como un Set, pero cada elemento tiene un score que permite ordenarlo.
Se accede por rango de valores o posiciones.
-
ZADDAñade un valor con puntuación.
1ZADD ranking 100 "Ana" 2ZADD ranking 150 "Luis" -
ZRANGEDevuelve elementos ordenados por puntuación (menor a mayor).
1ZRANGE ranking 0 -1 WITHSCORES -
ZREVRANGEOrden inverso.
1ZREVRANGE ranking 0 -1 WITHSCORES -
ZINCRBYIncrementa puntuación.
1ZINCRBY ranking 52 "Ana" 2# Ana ahora tiene 152
🔹 5. HASHES
Almacena un conjunto de pares campo-valor.
-
HSETAñade un campo y valor a un hash.
1HSET user:1 nombre "Lucia" 2HSET user:1 edad 30 -
HGETRecupera un campo específico.
1HGET user:1 nombre 2# Resultado: "Lucia" -
HGETALLTodos los campos y valores.
1HGETALL user:1 -
HDELElimina un campo.
1HDEL user:1 edad -
HLENDevuelve el número de campos.
1HLEN user:1 2# Resultado: 1 -
HINCRBYIncrementa un campo numérico.
1HINCRBY user:1 edad 9 2# Incrementa la edad en 9
🔹 6. BITMAPS
Permite trabajar directamente con bits individuales (SETBIT, GETBIT).
Muy eficiente para marcar presencia/ausencia (por ejemplo, asistencia o flags).
-
SETBIT/GETBITModifica y consulta bits individuales.
1SETBIT flags 2 1 2GETBIT flags 2 # Resultado: 1 -
BITCOUNTCuenta bits en 1.
1BITCOUNT flags # Resultado: 1
🔹 7. HYPERLOGLOG
Estructura para contar elementos únicos de forma aproximada, pero muy eficiente en memoria.
-
PFADDyPFCOUNTEstimación de elementos únicos.
1PFADD usuarios "juan" "ana" "luis" 2PFCOUNT usuarios 3# Resultado: 3
🔹 8. 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
-
GEOADDAñade ubicación geográfica.
1GEOADD ciudades 13.361389 38.115556 "Palermo" 2GEOADD ciudades 15.087269 37.502669 "Catania" -
GEODISTDistancia 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
Devuelve la coordenada de una o mas localizaciones.
1GEOPOS ciudades "Palermo" "Catania"
Obtener hash geoespacial (no muy útil para humanos):
1GEOHASH ciudades "Palermo"
🔹 9. 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
-
XADDAñade un evento al stream.
1XADD mediciones * temperatura 22- el * significa que generará el id automaticamente
-
XDELElimina un mensaje por ID.
1XDEL mediciones 1689999999999-0 -
XRANGEMuestra 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.
🔹 10. Trabajo con CLAVES
-
DELElimina una clave.
1DEL saludo -
EXPIRETiempo de vida en segundos.
1EXPIRE codigo 30 -
TTLVer cuántos segundos le quedan.
1TTL codigo -
RENAMECambia el nombre de la clave.
1RENAME saludo saludo_nuevo -
KEYSLista todas las claves que coincidan.
1KEYS user:* # Muestra todas las claves que comienzan con "user:"
🔹 11. TRANSACCIONES
-
MULTI,EXECAgrupa comandos que se ejecutan juntos.
1MULTI 2SET producto "camisa" 3INCR stock 4EXEC
🔹 12. 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.
-
SUBSCRIBE(Terminal A)1SUBSCRIBE canal -
PUBLISH(Terminal B)1PUBLISH canal "¡Nuevo mensaje!"
2.4. 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.
2.5. 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.