Actualizar datos en caché con TTL e invalidación

RedisBeginner
Practicar Ahora

Introducción

La caché reduce lecturas, pero puede conservar un precio antiguo cuando cambia el origen. Observarás esa ventana, dejarás caducar el valor y usarás invalidación explícita para hacer visible una actualización inmediatamente.

Completa primero Add a Cache to a Product Lookup. Este entorno nuevo incluye su propia aplicación, catálogo DynamoDB y nodo Valkey conectado. Usa Terminal para AWS CLI y la aplicación, y AWS View para comparar origen y respuestas. No se reutilizan recursos de otra VM.

Relación con la certificación

Certificación Tarea del examen Práctica
Cloud Practitioner (CLF-C02) Task 3.4 Distinguir una caché en memoria de los datos autoritativos y observar el comportamiento de la aplicación.

Esquema conceptual de este laboratorio

Renovar un precio después de caducar el TTL

TTL, tiempo de vida, limita cuánto permanece disponible una copia en caché. La caducidad elimina la copia, pero conserva el elemento autoritativo de DynamoDB.

Confirma la identidad y revisa la configuración:

cd /home/labex/project
aws sts \
  get-caller-identity
cat app.json

El ARN termina en labex-ca02-operator. La aplicación ya usa cache-aside y el precio inicial de 101 es 20.00. Guarda y muestra el endpoint:

CACHE_HOST=$(jq -r .cache_host app.json)
echo "$CACHE_HOST"

Configura cinco segundos para observar la caducidad. Solo las nuevas escrituras usan el TTL nuevo; cambiar el ajuste no modifica claves existentes:

jq '.ttl_seconds = 5' app.json > app.next.json
mv app.next.json app.json

Ejecuta el siguiente bloque completo, sin pausas entre sus operaciones: lee el valor original, actualiza DynamoDB directamente y vuelve a consultar antes de cinco segundos. La actualización directa no avisa a la caché de la aplicación:

curl -sS http://127.0.0.1:8080/api/products/101
aws dynamodb \
  update-item \
  --table-name product-catalog \
  --key '{"product_id":{"S":"101"}}' \
  --update-expression 'SET price = :price' \
  --expression-attribute-values '{":price":{"N":"21.00"}}' \
  --return-values ALL_NEW
curl -sS http://127.0.0.1:8080/api/products/101

DynamoDB devuelve 21.00, pero la respuesta inmediata sigue en 20.00 con served_from: cache. AWS View permite comparar el origen actualizado y la configuración. Actualizar la base de datos no invalida automáticamente una caché. Espera más que el TTL y consulta:

sleep 6
curl -sS http://127.0.0.1:8080/api/products/101

Obtendrás 21.00 del origen: la aplicación no encontró la clave caducada, leyó DynamoDB y guardó el valor nuevo. Consulta rápidamente el tiempo restante:

valkey-cli -h "$CACHE_HOST" -p 6379 TTL product:101

Un número positivo indica segundos restantes; -2 significa que la clave ya caducó. Cinco segundos es una demostración educativa; en producción, el TTL depende de la antigüedad que tolere la aplicación. Ejemplo de AWS View tras caducar: origen y respuesta muestran 21.00 con TTL de cinco segundos. Tu contador puede diferir.

Invalidar inmediatamente el producto actualizado

La invalidación elimina una copia para que la siguiente consulta lea el origen actual. Complementa al TTL y hace visibles las actualizaciones conocidas sin esperar la caducidad.

El HTTP PUT de la aplicación actualiza DynamoDB y elimina la clave correspondiente. Ejecuta el bloque completo: llena la caché, actualiza el precio y consulta dos veces. Mantener juntas las operaciones facilita observar el TTL corto:

curl -sS http://127.0.0.1:8080/api/products/101
curl -sS -X PUT \
  -H 'Content-Type: application/json' \
  --data '{"price":"22.00"}' \
  http://127.0.0.1:8080/api/products/101
curl -sS http://127.0.0.1:8080/api/products/101
curl -sS http://127.0.0.1:8080/api/products/101

La actualización indica invalidation_key: product:101 y normalmente removed: 1. Si la clave ya caducó, removed: 0 es válido, pero la clave de invalidación debe ser correcta. La siguiente consulta devuelve 22.00 del origen y la posterior devuelve 22.00 de la caché. Lectura e invalidación deben usar la misma clave.

Comprueba que el producto independiente 202 sigue siendo Notebook a 12.50:

aws dynamodb \
  get-item \
  --table-name product-catalog \
  --key '{"product_id":{"S":"202"}}' \
  --consistent-read

Deja la aplicación actualizada para verificar. Las comprobaciones consultan resultados reales y registros del origen; no exigen que una clave sobreviva a su breve TTL. Ejemplo tras actualizar la aplicación: el precio es 22.00 y Notebook no cambia. Otra consulta puede leer el origen cuando caduque el TTL corto.

Resumen

Observaste una respuesta obsoleta tras actualizar directamente el origen, su renovación al caducar y la renovación inmediata con invalidación dirigida. El origen sigue siendo autoritativo; el TTL limita la ventana de antigüedad y la aplicación invalida la clave exacta de lectura.

Para ampliar este tema, consulta la referencia de AWS: TTL y antigüedad aceptable de la caché; Resultados de TTL en Valkey.