Saltar al contenido

Capítulo 2 de 13

Claves, caducidad y estructuras que encajan

Elegir una representación por las operaciones que necesitas y controlar el tamaño y la vida de cada dato.

#Diseña las lecturas antes que el nombre de la clave

Para ejecutar los comandos de esta página, abre docker exec -it redis-practica redis-cli con la instancia del capítulo anterior. Escribe los bloques text en ese cliente interactivo; exit vuelve a la terminal normal.

Una clave identifica un valor y ese valor tiene un tipo. curso:usuario:42 no es una carpeta: los dos puntos son una convención legible. Redis no crea jerarquías ni permisos automáticamente por utilizarlos. Un nombre útil incluye aplicación, entidad e identificador; una caché puede añadir la versión de su formato: tienda:producto:v2:42.

Evita incorporar correos, tokens u otros datos sensibles al nombre. Las claves aparecen en diagnóstico y registros. Si una aplicación atiende varias organizaciones, incluye el identificador de organización obtenido de una sesión verificada, no de un parámetro que cualquiera pueda modificar. Los prefijos evitan colisiones; las ACL y la aplicación hacen cumplir permisos.

#Strings para una unidad que lees completa

Una string de Redis es una secuencia de bytes. Puede contener texto, JSON o un entero representado como texto. Desde redis-cli:

SET curso:producto:42 '{"nombre":"Lámpara","precio_centimos":3900}' EX 60
GET curso:producto:42
TYPE curso:producto:42
INCR curso:visitas
INCRBY curso:visitas 5

EX 60 fija sesenta segundos de vida. TYPE devuelve string, aunque el contenido parezca un objeto. Redis no conoce sus campos: modificar el JSON exige leerlo, transformarlo y escribirlo de nuevo. Para un pequeño documento que se consume entero resulta simple. Para modificar campos por separado, considera un hash.

En dinero, usar céntimos enteros evita errores de representación decimal; aquí solo modelamos un precio de ejemplo, no una contabilidad completa. INCR requiere un entero válido dentro del rango admitido: no convierte cualquier JSON en un número.

#TTL: un límite de vida, no una notificación exacta

TTL significa tiempo restante hasta que una clave caduque. TTL lo devuelve en segundos y PTTL en milisegundos. -1 indica una clave sin caducidad y -2 una clave inexistente. La expiración limita cuánto puede sobrevivir una copia; no demuestra que su contenido fuera reciente al guardarlo.

SET curso:temporal primera EX 60
TTL curso:temporal
SET curso:temporal segunda
TTL curso:temporal
EXPIRE curso:temporal 30
TTL curso:temporal

El segundo SET sustituye la clave y elimina su TTL previo: ahora aparece -1. EXPIRE añade una nueva caducidad. SET ... KEEPTTL conserva la existente cuando esa sea la intención. Preferimos SET ... EX ... frente a dos comandos separados cuando creamos una entrada temporal: si el proceso cae entre SET y EXPIRE, la segunda forma puede dejar una clave eterna.

Redis retira claves caducadas tanto al acceder a ellas como mediante trabajo periódico. No uses los eventos de expiración como un reloj exacto de negocio. Para ejecutar algo en una fecha, conserva la intención y comprueba explícitamente qué trabajos vencieron. Caducar una reserva tampoco revierte por sí solo un efecto que ya sucedió fuera de Redis.

#Hashes, sets y listas: operaciones diferentes

Tipo Necesidad Operación pequeña Operación que requiere cuidar el tamaño
Hash Campos de una entidad HGET, HSET, HINCRBY HGETALL trae todos los campos
Set Pertenencia sin repetidos SADD, SISMEMBER, SREM SMEMBERS trae todos los miembros
List Orden de inserción LPUSH, RPOP, rangos acotados LRANGE 0 -1 trae la lista completa
Sorted set Elementos ordenados por puntuación ZADD, ZSCORE Rangos sin límite pueden ser enormes
HSET curso:perfil:42 nombre Ana ciudad Madrid
HGET curso:perfil:42 nombre
SADD curso:favoritos:42 articulo-7 articulo-8 articulo-7
SCARD curso:favoritos:42
LPUSH curso:historial:42 inicio busqueda ficha
LRANGE curso:historial:42 0 2

El hash devuelve Ana. El set tiene cardinalidad dos: añadir articulo-7 otra vez no crea otro miembro. La lista queda ficha, busqueda, inicio porque LPUSH inserta cada elemento por la izquierda. El índice final de LRANGE es inclusivo; 0 2 devuelve como máximo tres elementos.

Un hash de perfil no valida automáticamente qué campos puede editar una persona. Un set de favoritos no resuelve la autorización sobre el artículo. Mantén las reglas de negocio en la aplicación y usa la estructura para las operaciones que te facilita.

#Sorted sets para consultar por orden

Un sorted set asocia cada miembro único a una puntuación numérica. Sirve para rankings, ventanas de tiempo o tareas planificadas. El dato se actualiza por miembro: añadir ana otra vez cambia su puntuación.

ZADD curso:ranking 120 ana 90 bruno 150 carla
ZREVRANGE curso:ranking 0 1 WITHSCORES
ZINCRBY curso:ranking 40 bruno
ZCARD curso:ranking

Primero obtienes a Carla y Ana; después Bruno suma cuarenta puntos. Empates se ordenan lexicográficamente por miembro, no por quién llegó primero. Para un orden estable de negocio, define cómo resolver empates en vez de asumir que Redis conoce tu criterio.

Para fechas, la puntuación puede ser un timestamp. Pero leer los vencidos y borrarlos son dos pasos: dos trabajadores podrían seleccionar lo mismo. Más adelante usarás operaciones compuestas o Streams, según si necesitas planificación, reparto o recuperación. Una estructura no equivale a un sistema de trabajos completo.

#Tamaños, recorridos y limpieza

GET de una string pequeña suele ser barato; traer un JSON de decenas de megabytes sigue costando transferencia, memoria y deserialización. Divide por unidades que realmente consumes. Establece límites en número de miembros y tamaño de valores desde que diseñas la clave, especialmente con identificadores aportados por usuarios.

SCAN 0 MATCH curso:* COUNT 100
MEMORY USAGE curso:perfil:42
UNLINK curso:perfil:42

SCAN devuelve un cursor y una tanda. Sigue usando el cursor devuelto hasta recibir 0; COUNT es una sugerencia de trabajo, no una paginación exacta. Puede devolver duplicados durante un recorrido y no es una fotografía consistente si las claves cambian. KEYS curso:* recorre todo de una vez y puede bloquear un servidor grande: reserva esa comodidad para un laboratorio diminuto.

UNLINK separa la clave y delega la liberación de su memoria; ayuda con valores grandes. DEL puede liberar esa memoria durante el comando. No ejecutes barridos de borrado por prefijo sin comprobar el entorno y acotar el propósito. Para migrar un formato de caché, un prefijo v3 y TTL razonables suelen ser más seguros que borrar todas las claves del servidor.

La referencia de SET documenta sus condiciones y caducidad; la de SCAN explica las garantías de recorrido. Antes de avanzar, comprueba que puedes justificar el tipo de clave para un perfil, una caché JSON, favoritos y los diez resultados mejor puntuados.

    ↑ ↓ para recorrer · Intro para abrir · Ctrl K para buscar