Tipos de Datos Fundamentales en Redis

Cadenas (Strings)

Las cadenas son el tipo de dato más simple en Redis, capaces de almacenar valores como texto, enteros o números de punto flotante. Internamente, Redis gestiona las cadenas como secuencias de bytes, similar a un ArrayList en Java, con una asignación de espacio predefinida para reducir la frecuencia de reasignaciones de memoria. El espacio asignado (capacity) suele ser mayor que la longitud real de la cadena (len). Para cadenas menores a 1 MB, el espacio se duplica al expandirse, y para tamaños mayores, se agrega 1 MB por expansión. La longitud máxima de una cadena es de 512 MB.

Se utilizan ampliamente en cachés para mejorar el rendimiento de consultas, como almacenar información de usuarios autenticados, datos de productos en comercio electrónico o contadores para limitar solicitudes (por ejemplo, rastrear accesos para bloquear direcciones IP).

Comandos


# Establecer una cadena
SET clave valor

# Obtener una cadena
GET clave

# Establecer múltiples cadenas
MSET clave1 valor1 clave2 valor2

# Obtener múltiples cadenas
MGET clave1 clave2

# Incrementar en 1
INCR clave

# Incrementar por un paso específico
INCRBY clave paso

# Decrementar en 1
DECR clave

# Decrementar por un paso específico
DECRBY clave paso

Ejemplo Práctico


> SET nombre_usuario juan
"OK"
> GET nombre_usuario
"juan"
> MSET edad 30 direccion madrid
"OK"
> MGET nombre_usuario edad
1) "juan"
2) "30"
> INCR contador
"1"
> INCR contador
"2"
> DECR contador
"1"
> INCRBY contador 5
"6"
> DECRBY contador 3
"3"
> DEL contador
"1"

Hashes

Los hashes en Redis son aálogos a un HashMap en Java, implementados como diccionarios desordenados con múltiples nodos que almacenan pares clave-valor. A diferencia de Java, Redis utiliza un rehash progresivo para evitar bloqueos durante el crecimiento. Este proceso mantiene dos estructuras hash durante la reasignación, migrando gradualmente los datos en operaciones posteriores. Cuando se eliminan todos los elementos, la estructura se borra automáticamente para liberar memoria.

Son útiles para almacenar objetos de forma estructurada, como información de usuarios, donde cada campo se guarda por separado, evitando la serialización. También se aplican en registros de compras o carritos de compras, con claves como ID de usuario y campos como ID de producto con cantidades.

Comandos


# Establecer campos en un hash
HSET clave campo1 valor1 campo2 valor2

# Obtener un campo específico
HGET clave campo

# Obtener todos los campos y valores
HGETALL clave

# Eliminar un campo
HDEL clave campo

# Contar el número de campos
HLEN clave

# Incrementar o decrementar un campo numérico por un paso
HINCRBY clave campo paso

Ejemplo Práctico


> HSET perfil_usuario nombre maria edad 28 ciudad barcelona
"3"
> HGET perfil_usuario nombre
"maria"
> HMGET perfil_usuario nombre edad
1) "maria"
2) "28"
> HGETALL perfil_usuario
1) "nombre"
2) "maria"
3) "edad"
4) "28"
5) "ciudad"
6) "barcelona"
> HLEN perfil_usuario
"3"
> HINCRBY perfil_usuario edad 5
"33"
> HINCRBY perfil_usuario edad -10
"23"
> HDEL perfil_usuario ciudad
"1"
> DEL perfil_usuario
"1"

Listas (Lists)

Las listas en Redis equivalen a LinkedList en Java, implementadas como listas enlazadas dobles que permiten operaciones de inserción y eliminación rápidas con complejidad O(1), aunque la búsqueda por índice es lenta (O(n)). Son ideales para estructuras donde el orden de inserción y extracción es importante.

Se usan en escenarios como listas de tareas pendientes, colas de trabajo (usando operaciones push y pop), o para mostrar elementos recientes como comentarios o productos destacados.

Comandos


# Insertar al inicio (izquierda)
LPUSH clave valor1 valor2 valor3...

# Extraer del inicio (izquierda)
LPOP clave

# Insertar al final (derecha)
RPUSH clave valor1 valor2 valor3...

# Extraer del final (derecha)
RPOP clave

# Obtener un rango de elementos por índice (inicio y fin inclusivos)
LRANGE clave inicio fin

Ejemplo Práctico


> LPUSH tareas limpiar cocinar estudiar
"3"
> RPUSH tareas deporte
"4"
> LPOP tareas
"estudiar"
> RPOP tareas
"deporte"
> LRANGE tareas 0 1
1) "cocinar"
2) "limpiar"

Nota: Existe una versión bloqueante de pop (BLPOP) para evitar sondeos continuos, útil en colas de trabajo donde los hilos de ejecución esperan tareas sin consumir recursos.

Conjuntos (Sets)

Los conjuntos en Redis son similares a HashSet en Java, implementados con un HashMap donde los valores son siempre nulos. Permiten eliminar duplicados rápidamente mediante hashing, con complejidad O(1) para operaciones de inserción, eliminación y búsqueda. Soportan operaciones de conjuntos como intersección, unión y diferencia.

Se aplican para calcular IPs únicas en sitios web, gestionar etiquetas de usuarios en perfiles, o encontrar amigos comunes en redes sociales.

Comandos


# Agregar elementos (sin duplicados)
SADD clave valor1 valor2

# Obtener todos los elementos
SMEMBERS clave

# Eliminar un elemento específico
SREM clave valor

# Eliminar y retornar un elemento aleatorio
SPOP clave

# Unión de dos conjuntos
SUNION clave1 clave2

# Diferencia entre conjuntos (elementos en clave1 pero no en clave2)
SDIFF clave1 clave2

# Intersección de conjuntos
SINTER clave1 clave2

Ejemplo Práctico


> SADD numeros 10 20 30
"3"
> SADD numeros 10 20 30
"0"
> SMEMBERS numeros
1) "10"
2) "20"
3) "30"
> SREM numeros 20
"1"
> SPOP numeros
"10"
> SADD conjunto_a 5 10 15
"3"
> SADD conjunto_b 10 15 20
"3"
> SINTER conjunto_a conjunto_b
1) "10"
2) "15"
> SDIFF conjunto_a conjunto_b
1) "5"
> SUNION conjunto_a conjunto_b
1) "5"
2) "10"
3) "15"
4) "20"

Conjuntos Ordenados (Sorted Sets)

Los conjuntos ordenados combinan características de conjuntos y HashMaps en Java. Cada valor tiene un puntaje (score) asociado para ordenar los elementos. Internamente, se utilizan un HashMap para mapear valores a puntajes y una lista de salto (skip list) para mantener el orden, permitiendo búsquedas eficientes. Cuando se eliminan todos los elementos, la estructura se libera automáticamente.

Son ideales para escenarios como tablas de clasificación en juegos, listas de tareas con prioridades, o rankings académicos.

Comandos


# Agregar elementos con puntajes
ZADD clave puntaje valor [puntaje valor...]

# Obtener elementos ordenados por puntaje ascendente (rango por índice)
ZRANGE clave inicio fin

# Obtener elementos dentro de un rango de puntajes (orden ascendente)
ZRANGEBYSCORE clave puntaje_minimo puntaje_maximo

# Eliminar un elemento
ZREM clave valor

# Contar el número total de elementos
ZCARD clave

# Contar elementos en un rango de puntajes (inclusivo)
ZCOUNT clave puntaje_minimo puntaje_maximo

# Obtener el rango de un elemento (orden ascendente, 0 es el primero)
ZRANK clave valor

# Obtener el rango de un elemento (orden descendente, 0 es el primero)
ZREVRANK clave valor

Ejemplo Práctico


> ZADD puntuaciones 85 ana 92 pedro 78 luis
"3"
> ZADD puntuaciones 85 ana 92 pedro 78 luis
"0"
> ZRANGE puntuaciones 0 2
1) "luis"
2) "ana"
3) "pedro"
> ZRANGEBYSCORE puntuaciones 80 100
1) "ana"
2) "pedro"
> ZREM puntuaciones luis
"1"
> ZCARD puntuaciones
"2"
> ZCOUNT puntuaciones 80 90
"1"
> ZRANK puntuaciones ana
"0"
> ZREVRANK puntuaciones ana
"1"

Búsqueda Binaria y Listas de Salto

La búsqueda binaria es un algoritmo para localizar elementos en una colección ordenada. Funciona dividiendo repetidamente la colección en mitades, ajustando los límites hasta encontrar el objetivo, con complejidad temporal O(log n), más eficiente que la búsqueda secuencial O(n).

Las listas de salto son estructuras de datos jerárquicas que facilitan la búsqueda en listas ordenadas, usadas en conjuntos ordenados de Redis. Constán de múltiples niveles enlazados, donde cada nivel es un subconjunto del inferior. La inserción aleatoria se maneja mediante una estrategia probabilística: los elementos pueden participar en múltiples niveles (por ejemplo, 100% en L0, 50% en L1, etc.), creando una estructura piramidal que permite búsquedas rápidas por saltos entre niveles.

Para buscar un elemento en una lista de salto, se comienza en el nivel más alto y se desciende progresivamente, comparando valores para navegar hacia la derecha o hacia abajo hasta encontrarlo o alcanzar el nivel base.

Etiquetas: Redis Strings hashes lists sets

Publicado el 7-16 22:13