DataSkills Hub

Valkey

Valkey es un almacén de datos en memoria (fork de Redis) para caché de respuestas API, feature store online para Feast (ML), y gestión de sesiones. Valkey es compatible con Redis y accesible en <tu-url>.

#Getting Started

#Conectarse a Valkey

Conexión vía CLI (valkey-cli)

$ valkey-cli -h <tu-url> -p <puerto>
valkey> PING
PONG

Verificar versión y conexión

valkey> INFO server
valkey> DBSIZE

Comando de autenticación (si está habilitado)

valkey-cli -h <tu-url> -a <password>

#Parámetros de conexión

Parámetro Ejemplo Descripción
-h <tu-url> Host del servidor
-p <puerto> Puerto (por defecto)
-a <password> Contraseña (si aplica)
-n 0 Seleccionar base de datos (0-15)
-c -c Conexión en cluster mode
--raw --raw Output sin formato
--csv --csv Output en CSV

#Tipos de Datos y Operaciones

#Strings (Cadenas)

Establecer y obtener valores

valkey> SET cache_key "valor"
OK
valkey> GET cache_key
"valor"
valkey> GETSET cache_key "nuevo"
"valor"

Operaciones numéricas

valkey> SET contador 10
OK
valkey> INCR contador
11
valkey> INCRBY contador 5
16
valkey> DECR contador
15

Múltiples claves (MSET/MGET)

valkey> MSET key1 "val1" key2 "val2" key3 "val3"
OK
valkey> MGET key1 key2 key3
1) "val1"
2) "val2"
3) "val3"

#Hashes (Diccionarios)

Almacenar metadatos de usuario

valkey> HSET usuario:123 nombre "Juan" email "[email protected]" pais "CO"
3
valkey> HGET usuario:123 nombre
"Juan"
valkey> HGETALL usuario:123
1) "nombre"
2) "Juan"
3) "email"
4) "[email protected]"
5) "pais"
6) "CO"

Operaciones con hashes

valkey> HEXISTS usuario:123 email
1
valkey> HDEL usuario:123 pais
1
valkey> HLEN usuario:123
2
valkey> HKEYS usuario:123
1) "nombre"
2) "email"

#Lists (Listas)

Cola de eventos o actividades recientes

valkey> RPUSH eventos "evento1" "evento2" "evento3"
3
valkey> LLEN eventos
3
valkey> LRANGE eventos 0 -1
1) "evento1"
2) "evento2"
3) "evento3"

Operaciones de cola (FIFO)

valkey> RPUSH cola_tareas tarea1 tarea2 tarea3
3
valkey> LPOP cola_tareas
"tarea1"
valkey> BLPOP cola_tareas 10
(waits up to 10 seconds for item)

#Sets (Conjuntos)

Tracking de usuarios únicos, tags

valkey> SADD usuarios_activos user1 user2 user3 user1
3
valkey> SCARD usuarios_activos
3
valkey> SMEMBERS usuarios_activos
1) "user1"
2) "user2"
3) "user3"

Operaciones de conjuntos

valkey> SISMEMBER usuarios_activos user1
1
valkey> SREM usuarios_activos user2
1
valkey> SINTER set1 set2
(intersection)

#Sorted Sets (Conjuntos Ordenados)

Ranking, leaderboards, features con score

valkey> ZADD top_clientes 1000 cliente_A 2500 cliente_B 1500 cliente_C
3
valkey> ZRANGE top_clientes 0 -1
1) "cliente_A"
2) "cliente_C"
3) "cliente_B"
valkey> ZRANGE top_clientes 0 -1 WITHSCORES
1) "cliente_A"
2) "1000"
3) "cliente_C"
4) "1500"
5) "cliente_B"
6) "2500"

Ranking invertido (mayor a menor)

valkey> ZREVRANGE top_clientes 0 -1 WITHSCORES
1) "cliente_B"
2) "2500"
3) "cliente_C"
4) "1500"
5) "cliente_A"
6) "1000"

#TTL y Expiración

#Establecer expiración

Expiración en segundos

valkey> SET sesion:abc123 "data" EX 3600
OK
valkey> TTL sesion:abc123
3599

Expiración en milisegundos

valkey> PSETEX cache_feature 60000 "feature_value"
OK
valkey> PTTL cache_feature
59998

Expiración en timestamp Unix

valkey> EXPIREAT clave_temporal 1678900000
1

Inspeccionar y modificar expiración

valkey> TTL clave
7200
valkey> PERSIST clave
1
valkey> TTL clave
-1

#Patrón común: Caché con TTL

Caché de respuestas API

valkey> SET api_response:ventas_hoy "{...}" EX 300
OK
valkey> GET api_response:ventas_hoy

#Pub/Sub (Publicación/Suscripción)

#Publicador y Suscriptor

Terminal 1: Suscriptor

valkey> SUBSCRIBE canal_alertas
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "canal_alertas"
3) 1

Terminal 2: Publicador

valkey> PUBLISH canal_alertas "Alerta: alta latencia detectada"
1

#Suscripción a múltiples canales

valkey> SUBSCRIBE canal_1 canal_2 canal_3
valkey> PSUBSCRIBE eventos_*

Usar en aplicaciones (e.g., Python)

import redis

r = redis.Redis(host='<tu-url>', port=<puerto>, decode_responses=True)
pubsub = r.pubsub()
pubsub.subscribe('canal_alertas')

for message in pubsub.listen():
    if message['type'] == 'message':
        print(f"Evento: {message['data']}")

#Monitoreo y Troubleshooting

#Comandos de monitoreo

Estado del servidor

valkey> INFO
valkey> INFO memory
valkey> INFO stats

Memoria usada

valkey> MEMORY USAGE clave
valkey> MEMORY STATS

Operaciones en tiempo real (monitor)

valkey> MONITOR

Clientes conectados

valkey> CLIENT LIST
valkey> CLIENT GETNAME
valkey> CLIENT ID

#Encontrar problemas comunes

Claves con patrón (cuidado en producción, puede ser lento)

valkey> KEYS api_response:*
valkey> KEYS usuario:*

Usar SCAN para explorar (más seguro)

valkey> SCAN 0 MATCH usuario:* COUNT 100

Eliminar claves con patrón

valkey> EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 "clave_temporal:*"

#Mejores Prácticas

#Convenciones de nomenclatura

Patrón Descripción Ejemplo
cache:<dominio>:<id> Caché API cache:usuarios:123
sesion:<token> Sesiones de usuario sesion:abc123xyz
feat:<feature>:<id> Feature store (Feast) feat:churn_score:4567
queue:<tarea> Colas de tareas queue:email_pendientes
lock:<recurso> Locks distribuidos lock:reporte_diario

#Uso desde Python (redis-py)

Instalación

pip install redis

Conexión y operaciones básicas

import redis

r = redis.Redis(
    host='<tu-url>',
    port=<puerto>,
    db=0,
    decode_responses=True
)

# Strings
r.set('cache_key', 'valor', ex=300)
valor = r.get('cache_key')

# Hashes
r.hset('usuario:123', mapping={
    'nombre': 'Juan',
    'email': '[email protected]'
})
datos = r.hgetall('usuario:123')

# Listas (cola)
r.rpush('cola_tareas', 'tarea1', 'tarea2')
tarea = r.lpop('cola_tareas')

# Expiración
r.expire('cache_key', 3600)

#Patrones seguros

Usar transacciones (pipeline)

pipe = r.pipeline()
pipe.set('key1', 'val1')
pipe.set('key2', 'val2')
pipe.execute()

Manejo de errores

try:
    valor = r.get('clave')
except redis.ConnectionError:
    print("No se pudo conectar a Valkey")

#También ver (Also see)