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)

  • 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

🔹 2. 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")

🔹 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…)

  • 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"

🔹 4. 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

🔹 5. 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

🔹 6. 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

🔹 7. HYPERLOGLOG

Estructura para contar elementos únicos de forma aproximada, pero muy eficiente en memoria.

  • PFADD y PFCOUNT

    Estimació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

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
  • 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.

🔹 10. 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:"

🔹 11. TRANSACCIONES

  • MULTI, EXEC

    Agrupa 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.

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.