Responder en un abrir y cerrar de ojos
La web de una librería necesita saber quién está conectado en cada clic. También debe contar visitantes y recordar las cinco últimas páginas que vio cada uno.
Una base de datos clásica puede hacerlo, pero se frena cuando miles de personas hacen clic a la vez. Un almacén clave-valor guarda esos datos pequeños en memoria y responde en una fracción de milisegundo.
Al final de esta lección
Nota
Puedo elegir un almacén clave-valor para el uso adecuado.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Almacén clave-valor | una base de datos que guarda un valor bajo un nombre | |
| Clave | el nombre que sirve para encontrar un valor | session:ana |
| Caducidad | el instante en que una clave se retira sola | |
| Atómico | hecho en un solo paso, que no se puede partir en dos | |
| Lista | varios valores en orden bajo una sola clave | |
| Hash | campos con nombre guardados bajo una sola clave |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un almacén clave-valor parece un diccionario
Un almacén clave-valor guarda un valor bajo una clave y lo devuelve cuando das la clave. Se parece a un diccionario de Python, pero en un servidor que comparten muchos programas.
Valkey es un almacén libre que guarda todo en memoria. Le envías un comando como SET o GET. Cada respuesta empieza con un símbolo: + para una respuesta corta, $ para texto, : para un número y * para una lista de respuestas.
Ejemplo: leer las respuestas
| Envías | Respuesta | Significa |
|---|---|---|
| SET stock:taza 40 | +OK | Guardado |
| GET stock:taza | $2, y después 40 | Un texto de longitud 2, que vale 40 |
| INCR visitas | :1 | Un número, el valor nuevo |
| GET clave-ausente | $-1 | No hay nada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Fabricar un cliente pequeño llamado v
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Guardar el stock de tazas
v SET stock:taza 40Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Volver a pedirlo
v GET stock:tazaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una clave puede caducar sola
Una sesión de conexión no debe durar para siempre. Con EX 60, una clave vive 60 segundos y luego el almacén la retira. No escribes ningún código de limpieza.
TTL pregunta cuántos segundos quedan. Cuando la clave ya no está, GET responde $-1.
Guardar una sesión durante un minuto
v SET session:ana token123 EX 60Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Preguntar cuánto tiempo le queda
v TTL session:anaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pedir una clave que no existe
v GET session:ausenteSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Cuándo deja de existir una clave?
# Una clave con caducidad es un valor y el instante en que desaparece.
entry = ["token123", 1060]
for now in [1000, 1059, 1060, 1100]:
if now < entry[1]:
print(now, "sigue ahí:", entry[0])
else:
print(now, "caducada")
# Cambia 1060 por 1090 y vuelve a ejecutar.
Contadores y listas trabajan por ti
INCR suma 1 a un número y devuelve el valor nuevo. Es atómico: mil visitantes a la vez se cuentan todos. Una lectura, una suma y una escritura por separado podrían perder alguno.
Una lista guarda valores en orden bajo una clave. RPUSH añade al final y LLEN da la longitud. Un hash guarda campos con nombre, como un perfil.
Contar visitas a mano
# Contar las páginas vistas en un diccionario: leer, sumar, escribir.
visits = {}
for page in ["inicio", "carrito", "inicio", "inicio"]:
if page in visits:
visits[page] = visits[page] + 1
else:
visits[page] = 1
print(visits)
# Un almacén clave-valor hace esa suma en un solo paso: varios escritores no se estorban.
Contar una visita a la página de inicio
v INCR visitas:inicioSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Anotar tres páginas vistas por Ana
v RPUSH recent:ana inicio carrito pagoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Preguntar qué tipo de valor hay guardado
v TYPE recent:anaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Guardar dos campos del perfil de Ana
v HSET user:ana name Ana city SevillaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Leer todos los campos
v HGETALL user:anaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error muy común
Advertencia
Mucha gente cree que un almacén clave-valor es un sitio seguro para todos los datos. La memoria es limitada y una clave puede caducar. Guarda la ficha de referencia en una base de datos. Usa el almacén para datos rápidos y de corta vida.
Para ir más lejos: cinco intentos por minuto
Una página de inicio de sesión permite cinco intentos por minuto a cada usuario. Construye ese límite con dos comandos que ya conoces: INCR sobre una clave como tries:bea, y EXPIRE tries:bea 60 tras el primer intento.
Lanza tu INCR seis veces. Apunta la sexta respuesta y lo que debería hacer la página con ella.