简介
商品缓存减少来源读取,但来源变化后缓存价格可能陈旧。观察陈旧窗口,让值到期,再通过显式失效使应用更新立即可见。
先完成“为商品查询添加缓存”。当前新环境独立提供相同商品应用、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。新写入的缓存使用配置的 TTL;修改设置不会追溯改变现有键:
jq '.ttl_seconds = 5' app.json > app.next.json
mv app.next.json app.json
以下代码块是一个时间敏感实验,应连续执行:读取原商品,直接更新来源,在五秒缓存存活时间结束前立即再次读取商品。直接 AWS 更新改变 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 用于训练中观察新鲜度,不是生产建议。生产 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,后续查询从缓存返回 22.00。显式失效补充 TTL,必须使用与读取路径相同的键。
商品 202 与此次价格更新无关。确认其源记录仍是价格为 12.50 的 Notebook:
aws dynamodb \
get-item \
--table-name product-catalog \
--key '{"product_id":{"S":"202"}}' \
--consistent-read
保留更新后的应用供验证。检查读取实际请求结果及源记录,不要求短 TTL 到期后缓存键仍然存在。

总结
你观察了直接来源更新后的真实陈旧缓存响应、TTL 到期后的刷新,以及定向失效后的即时刷新。来源始终权威;TTL 限制陈旧窗口,应用更新路径使准确的读取键失效。
进一步阅读 AWS 官方资料:TTL 与可接受的缓存陈旧程度; Valkey TTL 返回值。


