Обновление кэша с TTL и инвалидацией

RedisBeginner
Практиковаться сейчас

Введение

Кэш уменьшает чтения, но после изменения источника может возвращать старую цену. Наблюдайте это окно, дождитесь истечения срока и используйте явную инвалидацию для немедленного отображения обновления.

Сначала пройдите Add a Cache to a Product Lookup. Новая VM независимо предоставляет приложение, каталог DynamoDB и подключённый Valkey. Используйте Terminal для AWS CLI и запросов приложения, AWS View — для сравнения. Ресурсы предыдущей VM не используются.

Связь с сертификацией

Сертификация Задача экзамена Практика
Cloud Practitioner (CLF-C02) Task 3.4 Отличать кэш в памяти от достоверных исходных данных и наблюдать поведение приложения.

Концептуальная схема лабораторной работы

Обновление цены после истечения TTL

TTL, время жизни, ограничивает доступность копии в кэше. Истечение удаляет копию, но не исходный элемент DynamoDB.

Подтвердите идентификацию и проверьте настройки:

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

ARN оканчивается на labex-ca02-operator. Приложение уже использует cache-aside, исходная цена 101 — 20.00. Сохраните и выведите endpoint:

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

Установите пять секунд для короткой демонстрации. Настройка применяется к новым записям кэша, но не меняет срок существующих ключей:

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

Выполните следующий блок целиком без пауз: прочитайте исходный товар, напрямую обновите DynamoDB и снова запросите товар до истечения пяти секунд. Прямое обновление не уведомляет кэш приложения:

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

Источник сообщает 21.00, немедленный ответ кэша — 20.00 с served_from: cache. AWS View показывает новый исходный элемент и конфигурацию. Изменение базы не инвалидирует кэш автоматически. Подождите дольше TTL и запросите:

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

Ответ возвращает 21.00 из источника: истёкший ключ отсутствует, поэтому приложение читает DynamoDB и сохраняет новое значение. Быстро проверьте оставшееся время:

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

Положительное число — оставшиеся секунды, -2 означает уже истёкший ключ. Пять секунд выбраны для наблюдения, а не как производственная рекомендация. TTL зависит от допустимого устаревания. Пример AWS View после истечения: источник и ответ показывают 21.00 при TTL пять секунд. Счётчик может отличаться.

Немедленная инвалидация изменённого товара

Инвалидация удаляет копию, чтобы следующий запрос прочитал актуальный источник. Она дополняет TTL и делает известное изменение видимым сразу.

HTTP PUT приложения обновляет DynamoDB, затем удаляет соответствующий ключ. Выполните заполнение, обновление и два чтения одним блоком, чтобы наблюдать короткий TTL:

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

Ответ указывает invalidation_key: product:101 и обычно removed: 1. Если ключ уже истёк, removed: 0 допустим, но ключ инвалидации всё равно должен быть правильным. Следующий запрос возвращает 22.00 из источника, повторный — из кэша. Чтение и инвалидация должны использовать один ключ.

Проверьте независимый товар 202: Notebook по-прежнему стоит 12.50:

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

Оставьте обновлённое приложение для проверки. Проверки читают реальные результаты и исходные записи; ключ не обязан сохраняться после короткого TTL. Пример после обновления приложения: цена 22.00, Notebook не изменён. После короткого TTL последующий запрос может снова прочитать источник.

Итоги

Вы наблюдали старую цену после прямого изменения базы, обновление после TTL и немедленное обновление через точечную инвалидацию. Источник остаётся достоверным, TTL ограничивает окно устаревания, а приложение удаляет точный ключ чтения.

Подробнее см. в документации AWS: TTL и допустимое устаревание кэша; Результаты TTL в Valkey.