商品改价不生效?商城上下架与缓存更新一致性的配置实践
上周运营在后台把一款商品从 199 改成 159,半小时后用户下单还是按 199 结算,客服后台炸了。查下来是缓存更新策略的问题:商品详情页走了 CDN 缓存,运营改价只更新了数据库,没有主动失效 CDN 缓存。这篇把商品缓存一致性的配置过程记录下来。
一、先搞清楚缓存有几层
商城商品信息至少经过三层缓存,每一层都要考虑失效:
| 缓存层 | 存储位置 | 过期时间 |
|---|---|---|
| CDN 缓存 | 边缘节点 | 自定义,可到小时级 |
| 应用缓存 | Redis | 分钟级 |
| 本地缓存 | 应用内存 | 秒级 |
问题往往出在 CDN 层:它离用户最近、缓存时间最长,数据库改了它不知道,用户看到的就是旧数据。
二、改价生效的缓存更新流程
正确的更新顺序是"先改库,再失效缓存":
1. 运营在后台提交改价
2. 更新数据库商品表价格字段
3. 删除 Redis 中的商品缓存 key
4. 调用 CDN 刷新接口,按 URL 或目录失效缓存
5. 返回运营"改价成功"
用户访问时:
→ CDN 未命中 → 回源
→ Redis 未命中 → 查库并回填 Redis
→ 页面展示新价格
关键点:更新数据库成功后才允许失效缓存。如果先失效缓存再改库,中间一秒用户请求会把旧价格重新回填进缓存。
三、价格相关的三个特殊处理
购物车/结算页不走 CDN:涉及价格的页面(购物车、结算、订单确认)不能用 CDN 缓存,改走动态接口,避免边缘节点返回旧价。
价格用版本号:商品缓存 key 带版本号(product:price:1001:v2),改价时版本号 +1,旧 key 自然过期,比手动删 key 更可靠。
上下架即时生效:下架商品要同时做两件事——失效 CDN + 全站商品列表缓存清除,否则用户还能通过列表页链接进入已下架商品详情。
四、踩坑清单(这 5 个坑都踩过)
- 只改数据库没刷新 CDN,价格半小时不生效
- 先失效缓存再改库,中间一秒旧价被重新回填
- 结算页走了 CDN 缓存,用户下单价格和详情页不一致
- 下架商品只清了详情缓存,列表页缓存还留着入口
- 大促改价批量操作时 CDN 刷新接口被限流,改成目录刷新+版本号方案解决
这次商城用的是乔拓云的商城产品,商品上下架和缓存失效在后台联动处理,我主要补充了价格版本号和结算页禁用缓存这两块,改价现在秒级生效。
复盘要点
- 缓存失效顺序:先改库成功,再逐层失效缓存
- 涉及价格的页面一律动态渲染,不走 CDN
- 缓存 key 带版本号,批量改价用目录刷新
以上是个人实践记录,各平台具体功能以官方实时信息为准。
开放问题:你们商城做缓存一致性时,还遇到过哪些数据不一致的场景?