电商商品详情页缓存键需组合协议、域名、URI、方法、用户角色哈希、终端类型,并清洗UTM等干扰参数;动态内容用Lua注入,主HTML缓存10–30秒,关键变量须与Lua key逻辑对齐。

电商商品详情页的缓存键设计,核心是让“内容相同、用户可见性一致”的请求命中同一份缓存,同时避免不同用户、不同设备、不同状态看到彼此数据。不能只拼接 URL,也不能无差别包含所有参数——要识别关键维度、清洗干扰项、兼顾安全与命中率。
关键变量必须组合:区分场景与身份
商品详情页看似静态,实则受登录态、地域、终端类型、促销活动等影响。缓存键需显式体现这些业务敏感维度:
-
基础标识:用
$scheme、$host(非$proxy_host,防多子域混用)、$request_uri确保协议和域名准确 -
请求方法:加入
$request_method,防止 HEAD 请求意外覆盖 GET 缓存 -
用户角色:不直接写
$cookie_user_id(明文泄露风险),改用哈希值,如md5($cookie_user_id);未登录用户统一设为"guest" -
终端类型:优先用
$http_x_requested_with(值为XMLHttpRequest或空)判断是否为 Ajax 请求;移动端适配可加$http_ua_device(需 Nginx 预设 map 映射)
查询参数必须清洗:剔除干扰,保留语义
商品详情页 URL 常带 ?utm_source=xxx&ts=1234567890&v=2 类参数,它们不影响页面内容,却会导致缓存碎片化:
- 在
http块中定义map清洗参数串,例如剔除utm_*、ts=、v=、random= - 缓存键中使用清洗后的变量,如:
proxy_cache_key "$scheme$host$request_uri$is_args$clean_args|$user_role|$device_type"; - 若后端对参数顺序不敏感(如
?id=1001&cid=2和?cid=2&id=1001返回相同内容),Nginx 不支持自动排序,建议仅对明确需参数区分的路径启用缓存(如限定location ~ ^/item/)
动态内容补丁:用 Lua 分离可缓存与不可缓存部分
纯 HTML 缓存无法满足“实时库存”“已购提示”“限购倒计时”等需求。此时不应放弃缓存,而是分层处理:
- 主页面 HTML 由 Nginx 缓存(TTL 设为 10–30 秒),但移除动态字段,留占位符如
<div data-stock="placeholder"></div> - 用 OpenResty + Lua 在 Nginx worker 内查 Redis 或共享内存
shared_dict,获取库存、限购状态等高频小数据,毫秒级注入到响应中 - 缓存键中不包含这些动态字段,但需确保 Lua 脚本的 key 构建逻辑与主缓存键对齐(如都基于商品 ID + 用户角色哈希)
验证与兜底:确保配置真实生效
写完配置不等于缓存就工作。必须验证 key 是否按预期生成,并设置降级机制:
- 添加日志格式:
log_format cache '$cache_key - $upstream_cache_status';,并在access_log中启用 - 响应头中输出缓存状态:
add_header X-Cache-Status $upstream_cache_status;,配合curl -I快速观察 HIT/MISS/MISS - 临时将 key 设为固定字符串(如
"debug_item"),确认多个不同请求是否全部命中,排除 zone 未启用或路径未匹配等问题 - 为防止突发失效导致雪崩,开启
proxy_cache_use_stale error timeout updating http_500;,允许返回过期缓存继续服务


















