Clave-valor y la caché
En resumen: Una base clave-valor como Redis es un diccionario en memoria que devuelve muy rápido el valor de una clave, por lo que sirve bien como caché, para sesiones y para contadores.
Problema
La página que pregunta lo mismo miles de veces
La página de inicio de la tienda muestra los tres productos más vendidos. Esta es la consulta:
Une tres tablas y suma todas las líneas de pedido. Con 2000 visitas por minuto la base de datos la ejecuta 2000 veces, aunque la respuesta cambia una vez cada pocas horas. El carrito y el inicio de sesión también preguntan lo mismo a la base de datos en cada página. Necesitas un lugar donde la respuesta ya preparada se obtenga en una fracción de milisegundo.
La idea
Una clave y un valor
Una base de datos clave-valor es un diccionario: cada valor tiene una clave, y lo obtienes por la clave. No hay tablas, ni columnas, ni consultas por valor. Por eso es tan rápida: Redis lo guarda todo en memoria y responde en microsegundos.
El campo es un simulador con los comandos de Redis. Las claves suelen escribirse con dos puntos, para que se vea qué contienen:
GET sobre una clave que no existe da (nil). El valor es texto, incluso cuando es un número: la base de datos no sabe que 7.90 es un precio.
Pruébalo
Un contador de visitas
INCR incrementa en 1 el número de una clave y devuelve el nuevo. Si la clave no existe, empieza desde 0. Dos páginas que cuentan al mismo tiempo no se estorban: cada comando de Redis se ejecuta hasta el final antes del siguiente.
El producto 7 se vio tres veces y el producto 9 una. Cuenta las visitas en las claves views:product:7 y views:product:9.
Solución
INCR views:product:7
INCR views:product:7
INCR views:product:7
INCR views:product:9
Cuatro veces INCR, tres para el 7 y una para el 9. La comprobación lee las dos claves a la vez con MGET y ve «3» y «1». Con GET y después SET con el número nuevo, dos páginas a la vez perderían una visita. INCR es una sola operación.
La idea
Una caché que caduca
Una caché es una copia de una respuesta que es cara de calcular. El programa mira primero en la caché. Si no hay nada, pregunta a la base de datos y guarda la respuesta en la caché durante un tiempo fijo (EX, en segundos). Ese tiempo es el TTL (time to live, tiempo de vida), y TTL muestra cuánto queda:
A los 60 segundos la clave desaparece sola, y la siguiente visita vuelve a preguntar a la base de datos. Así la caché nunca tiene más de un minuto de antigüedad, y la base de datos ejecuta la consulta una vez por minuto, no 2000 veces.
Más precisamente, para curiosos
SLEEP es un comando solo del simulador: adelanta su reloj para que no tengas que esperar de verdad. En el Redis real el tiempo simplemente pasa. El simulador ordena alfabéticamente la respuesta de SMEMBERS y KEYS, mientras que Redis no promete ningún orden. Y KEYS no se usa en un servidor real con millones de claves: las recorre todas y bloquea cualquier otro comando. Allí se usa SCAN.
Míralo
La copia obsoleta
El precio del café baja de 14,90 € a 12,90 €. La base de datos está actualizada, pero la caché sigue guardando la página antigua otros 10 minutos:
Este es el error más común con una caché: la copia difiere de la verdad. Por eso el programa que cambia el producto en la base de datos borra enseguida su copia en la caché (DEL). La siguiente visita no encuentra nada, pregunta a la base de datos y guarda el precio nuevo. El TTL se queda como red de seguridad, por si alguna vez te olvidas.
Pruébalo
Un precio nuevo para el queso
La caché guarda las páginas del queso blanco (producto 7) y de la mantequilla (producto 9). El precio del queso acaba de cambiar en la base de datos. Haz que la siguiente visita al queso reciba el precio nuevo, sin tocar la mantequilla.
Solución
DEL cache:product:7
DEL cache:product:7. FLUSHALL también quitaría el precio antiguo, pero todo lo demás también: todo el sitio va a la vez a la base de datos. Y escribir el precio nuevo directamente en la caché significa dos fuentes de verdad: si falla la escritura en la base de datos, la caché miente.
La idea
No solo texto
Un valor en Redis también puede ser una estructura. Cada una tiene sus propios comandos:
- hash (
HSET,HGET,HINCRBY,HGETALL): campos bajo una clave, como un carrito con un producto y una cantidad; - lista (
LPUSH,LRANGE,LTRIM): valores ordenados, como los vistos recientemente; - conjunto ordenado (
ZADD,ZINCRBY,ZREVRANGE): miembros con una puntuación, ordenados por ella, como un ranking.
El carrito del cliente 42 (producto 9, mantequilla, dos unidades, y producto 5, leche, una), que caduca tras una semana sin actividad:
Los tres últimos productos vistos. LPUSH inserta delante, y LTRIM corta todo lo que hay después del tercero:
Las unidades vendidas en octubre, en un ranking:
Con puntuaciones iguales Redis ordena los miembros alfabéticamente (aquí al revés, porque el ranking va de arriba abajo).
Ejercicio
Una sesión, un carrito y un ranking
1. El cliente 42 inicia sesión. El sitio le da el número de sesión 9f2c y guarda en Redis quién es.
Guarda el número del cliente (42) en la clave session:9f2c de modo que la sesión caduque sola a los 30 minutos.
Solución
SET session:9f2c 42 EX 1800
SET session:9f2c 42 EX 1800: 30 minutos son 1800 segundos. Una sesión sin caducidad se queda para siempre si el cliente simplemente cierra la ventana, y la memoria de Redis se llena de sesiones muertas.
2. El carrito del cliente 7 está en el hash cart:7: el campo es el número del producto, y el valor es la cantidad.
El cliente 7 pone en el carrito 2 paquetes de mantequilla (producto 9) y 1 leche (producto 5). Después añade una mantequilla más y quita la leche.
Solución
HSET cart:7 9 2
HSET cart:7 5 1
HINCRBY cart:7 9 1
HDEL cart:7 5
HSET cart:7 9 2, HSET cart:7 5 1, HINCRBY cart:7 9 1 y HDEL cart:7 5. Queda un campo: el producto 9 con 3 unidades. HINCRBY cambia la cantidad en el sitio, sin leer la anterior.
3. La clave rating guarda la valoración media de cada producto.
Muestra los tres productos con la valoración más alta, junto con las valoraciones, de la más alta hacia abajo.
Solución
ZREVRANGE rating 0 2 WITHSCORES
ZREVRANGE rating 0 2 WITHSCORES: del primero (0) al tercero (2), en orden inverso, con las puntuaciones. ZRANGE da las más bajas, y sin WITHSCORES no se muestran las valoraciones.
La idea
Cuándo clave-valor y cuándo no
Una base clave-valor es buena cuando siempre conoces la clave: una caché, sesiones, carritos, contadores, limitación de frecuencia («como máximo 5 intentos de inicio de sesión por minuto»), colas de trabajos. No es buena cuando preguntas por el valor («todos los productos por menos de 5 €»), cuando los datos están conectados («los pedidos del cliente con sus productos») y cuando perderlos no es aceptable. Por eso suele estar junto a la base SQL, no en su lugar: la base de datos es la verdad, y Redis es su copia rápida.
Más precisamente, para curiosos
Además de Redis (y Valkey, que es compatible con él), son bases clave-valor Memcached (solo caché, sin estructuras), DynamoDB en AWS (con una clave y una clave de ordenación, en disco, distribuida) y etcd (para la configuración de clústeres, centrado en la consistencia). Redis guarda los datos en disco de dos maneras: una instantánea cada pocos minutos (RDB) o un registro de cada comando (AOF).
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Muchas tablas, y una tabla unida consigo misma · UPDATE: cambiar valores · Conectarse a la base de datos desde el código · OLTP y OLAP
- Continúa en: Bases de datos documentales · Replicación, sharding y CAP · Cómo elegir una base de datos
- Ejercicios sobre el tema: Tipos de bases de datos