product-detaillisted
Install: claude install-skill 1398281322-a11y/java-backend-guardrails
# 商品详情页
## When to Invoke
商详、SKU 规格、详情高 QPS、静态化、详情缓存脏了。电商面试:「详情页怎么抗高并发」。
## When NOT
缓存三件套细节 → `cache-trap`。秒杀活动页 → `seckill`。购物车 → `cart`。OSS 直传/STS/私有桶 → `file-oss`。
## 风险(面试考点)
详情 QPS 高但变更少:必须 **页面静态/CDN + 多级缓存**。把库存、价格强绑在同一超长 TTL 缓存里,会卖过期价或显示有货实际无货。
SKU:规格(颜色/尺码)组合爆炸,不要为每个组合生成一张详情 HTML。SPU 静态,SKU 价与库存动态接口。
## 方案选型(轻量优先)
| 数据 | 默认 |
|------|------|
| 标题、图文、规格定义 | CDN / 静态化,TTL 长,发布时刷新 |
| 价格、活动标签 | Redis 短 TTL 或主动删 |
| 可售库存 | 不进长缓存;短 TTL 或单独接口,允许最终一致 |
| SKU 列表 | `spu_id` 一次取出,前端选规格 |
读路径:CDN → 本地 Caffeine → Redis → DB。写:改 DB 后删对应 key(`cache-trap`)。
## 默认方案
```text
GET /spu/{id} 可缓存
GET /spu/{id}/live 价格+可售,Cache-Control 短或协商缓存
key: spu:{id}:info
key: spu:{id}:live
```
SKU 表:`uk(spu_id, spec_md5)`,库存在 sku 行或库存中心,不要复制进详情 JSON 长期存。
运营改图:发版本号或删 CDN。不要指望等 TTL。
## 反例
错误:详情 JSON 里带 stock=1234,缓存 1 小时。
正确:库存单独短缓存或实时。
错误:每个 SKU 一张静态页 × 上万规格。
正确:SPU 一页 + SKU 接口。
错误:秒杀也走普通商详集群。
正确:秒杀页静态独立,见 `seckill`。
## 验证
- 压测商详,DB QPS 远低于入口。
- 改价后详情 live 接口很快变;图文允许稍延迟。
- 无货 SKU 在 live 接口体现,静态页仍可打开。
## 评审清单
- [ ] 图文与价格库存分离缓存
- [ ] 写后删缓存或版本号
- [ ] 未把秒杀流量接在普通商详上
---