Ir al contenido
wannacode

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:

SQLbase de datos: tienda

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:

clave-valor (como Redis)simulador

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.

clave-valor (como Redis)simulador

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:

clave-valor (como Redis)simulador

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:

clave-valor (como Redis)simulador

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.

clave-valor (como Redis)simulador

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:

clave-valor (como Redis)simulador

Los tres últimos productos vistos. LPUSH inserta delante, y LTRIM corta todo lo que hay después del tercero:

clave-valor (como Redis)simulador

Las unidades vendidas en octubre, en un ranking:

clave-valor (como Redis)simulador

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.

clave-valor (como Redis)simulador

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.

clave-valor (como Redis)simulador

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.

clave-valor (como Redis)simulador

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

1. ¿Qué NO se puede hacer en una base clave-valor sin leer todas las claves?
2. La lista de los más vendidos se guarda 60 segundos en la caché. ¿Cuál es el precio de eso?
3. El precio del café cambió en la base de datos. ¿Qué es lo más seguro para la caché?
4. Redis guarda los datos en memoria. ¿Qué pasa al reiniciar?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·