TTL과 무효화로 캐시 데이터 갱신하기

RedisBeginner
지금 연습하기

소개

캐시는 원본 읽기를 줄이지만 원본이 바뀌면 이전 가격을 반환할 수 있습니다. 오래된 값이 유지되는 구간과 만료 후 갱신을 관찰하고 명시적 무효화로 업데이트를 즉시 반영합니다.

먼저 Add a Cache to a Product Lookup을 완료하세요. 새 환경에는 독립적인 애플리케이션, DynamoDB 카탈로그와 연결된 Valkey가 제공됩니다. Terminal에서 AWS CLI와 애플리케이션 명령을 사용하고 AWS View에서 원본과 응답을 비교합니다. 이전 VM의 리소스는 재사용하지 않습니다.

자격증 관련 내용

자격증 시험 과제 실습
Cloud Practitioner (CLF-C02) Task 3.4 메모리 캐시와 원본 데이터를 구분하고 애플리케이션 동작을 관찰합니다.

이 실습의 개념도

TTL 만료 후 가격 갱신하기

TTL, time to live는 캐시 값이 유지되는 시간을 제한합니다. 만료는 캐시 복사본만 지우고 기준이 되는 DynamoDB 항목은 삭제하지 않습니다.

신원과 설정을 확인합니다.

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

ARN은 labex-ca02-operator로 끝납니다. 애플리케이션은 이미 cache-aside를 사용하며 101의 초기 가격은 20.00입니다. 엔드포인트를 저장하고 출력합니다.

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

짧은 관찰을 위해 TTL을 5초로 설정합니다. 새로 쓰는 캐시 값에 적용되며 기존 키의 수명을 소급해서 바꾸지는 않습니다.

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

다음 블록은 한 번에 실행하세요. 원래 상품을 읽고 DynamoDB를 직접 업데이트한 뒤 5초가 지나기 전에 다시 읽습니다. 직접 업데이트는 애플리케이션 캐시에 알리지 않습니다.

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는 이미 만료된 키입니다. 5초는 교육용 관찰 값이며 운영 권장값이 아닙니다. 운영 TTL은 허용 가능한 데이터 지연에 따라 결정합니다. 만료 후 AWS View 예시: 원본과 응답은 21.00이며 TTL은 5초입니다. 읽기 횟수는 다를 수 있습니다.

업데이트한 상품을 즉시 무효화하기

무효화는 캐시 복사본을 지워 다음 요청이 최신 원본을 읽게 합니다. 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, 그다음은 캐시의 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 및 허용 가능한 캐시 노후화; Valkey TTL 반환값.