动静分离按业务类型设置差异化缓存的关键,不是把所有静态文件丢给CDN,而是先按静态资源、动态接口、半动态页面、交易链路分业务类型,再分别设置TTL、失效机制和回源策略。 这样既能压住回源,又不会让价格、库存和订单缓存出错。
动静分离缓存怎么配置:先分业务类型,再定缓存层级
很多团队一上来就改Nginx的location,静态动态一刀切,结果静态资源发布后用户拿到旧JS,动态接口又因为缓存太短把数据库打满,更稳的顺序是业务盘点、缓存分层、失效设计。
静态资源:长缓存靠文件名指纹
- JS、CSS、图片、字体这类内容,文件名带hash时,可以返回
Cache-Control: public, max-age=31536000, immutable。 - HTML入口不跟着长缓存,用
Cache-Control: no-cache配合ETag,每次协商。 - 操作路径很具体:在
/etc/nginx/conf.d/static.conf里给/static/设置过期头,CDN控制台把/static/的缓存TTL设到30天以上,把/index.html设0。 - 验证命令:
curl -I https://example.com/static/app.9f2c.js,看响应头里有没有Cache-Control和ETag。
静态资源长缓存的前提是版本化文件名,没有hash,TTL越长,发布事故越难收场。
动态接口:短缓存靠主动失效
- 商品价格、库存、优惠券这类读多写少、允许短时不一致的接口,TTL设秒级到分钟级,写操作后通过消息队列主动删key。
- 订单、支付结果、用户资产不缓存,或者只做会话级本地缓存,不能拿缓存当交易依据。
- Redis key按业务类型分前缀,例如
biz:goods:{goodsId}:price、biz:goods:{goodsId}:stock,避免大key混用。 - 网关对GET且无用户态的接口做边缘缓存,接口返回
Cache-Control: private, max-age=30,写操作后发失效消息。
半动态页面:分片缓存别整页硬缓
商品详情页适合“静态骨架+动态片段”:标题、图片、图文详情走CDN,价格库存走接口,页面片段可以用ESI或边缘包含,缓存键带上地域、语言和登录态维度,带用户昵称的HTML不要整页公共缓存,容易串号。Vary头只放必要维度,否则缓存碎片会把命中率拉低。
静态资源CDN和动态接口缓存有什么区别
| 维度 | 静态资源CDN缓存 | 动态接口缓存 |
|---|---|---|
| 缓存对象 | JS、CSS、图片、字体 | JSON、页面片段、半动态HTML |
| TTL | 长,通常按月 | 短,秒到分钟 |
| 失效方式 | 文件名指纹加版本发布 | 主动删key加业务事件通知 |
| 命中率 | 较高 | 受业务变化影响 |
| 主要风险 | 发布旧资源 | 价格库存不一致 |
行业共识认为,缓存策略的难点不在加缓存,而在失效路径是否可观测,静态资源靠版本号,动态接口靠业务事件,两套机制不能共用同一个TTL。
按业务类型设置差异化缓存的三个实操步骤
- 盘点:列出所有URL和接口,标记“可公开缓存、需登录、交易强一致、半动态”四类。
- 定键:静态用路径加版本;动态用业务ID加地域加登录态;不要把session塞进公共缓存键。
- 看回源:在Nginx日志看
upstream_cache_status,在CDN日志看X-Cache,先优化回源量大的业务类型,不要平均用力。
电商大促场景下缓存怎么按业务类型设置
电商大促场景下缓存怎么按业务类型设置,关键是把“展示型”和“交易型”拆开,展示型可以激进缓存,交易型要保守。
商品详情页:骨架长缓存,价格库存短缓存
- 页面骨架、图文详情、评价摘要走CDN,TTL按小时到天。
- 价格、库存、促销标签走接口缓存,TTL秒级到分钟级,大促前预热热点商品。
- 缓存键加活动ID,避免日常价和活动价互相污染。
购物车与订单:交易链路少缓存
购物车列表按用户维度,不适合CDN公共缓存;可以用Redis会话缓存,设置短TTL并校验登录态,订单详情、支付状态直接读库或读主库,缓存只做降级展示,写操作先更新库再删缓存,避免旧值回填。
秒杀接口:本地缓存加限流
库存扣减前用本地缓存Caffeine扛热点,Redis做原子扣减,数据库只落单,网关按业务类型设限流,秒杀接口单独线程池,大促前做缓存穿透演练,空值缓存给短TTL,热点key提前分片。
动静分离缓存一年多少钱:成本花在哪儿
动静分离缓存一年多少钱,不能只看CDN单价,通常由CDN流量、Redis内存、回源带宽、运维人力四块组成,不同业务类型缓存策略不同,成本结构也不同。
| 规模 | 主要成本 | 年度预算区间(模糊) |
|---|---|---|
| 小型站点 | CDN流量加基础Redis | 几千元到数万元 |
| 中型电商 | CDN流量加Redis集群加回源带宽 | 数万到数十万元 |
| 大型平台 | 多地域边缘节点加专线加运维 | 数十万元以上 |
静态资源长缓存能降低回源带宽,但版本发布频繁会增加CDN刷新成本,动态接口短缓存能减少数据库压力,但Redis内存和失效消息队列也是钱,据工信部数据,近年来边缘节点和CDN下沉让静态资源就近分发更普遍,预算里要把边缘缓存规则维护算进去。
北京动静分离缓存方案怎么选
北京动静分离缓存方案怎么选,先看用户分布,北方流量为主时,把静态资源同步到北京及周边边缘节点,动态接口回源到华北机房,减少跨地域RTT,CDN缓存规则按/static/、/api/、/page/分路径配置,不要全站一个TTL,Nginx回源加proxy_cache_lock on,避免热点失效时大量请求穿透,涉及个人信息和交易数据时,缓存日志要脱敏,敏感字段不进公共CDN缓存。
动静分离按业务类型设置差异化缓存,本质是把“能缓存的”和“不能缓存的”用业务规则隔开,先把失效路径设计清楚,再追求命中率,才不会用缓存换事故。
Q&A:动静分离按业务类型设置差异化缓存常见问题
静态文件缓存多久合适?
带hash的JS、CSS、图片可以设一年并加immutable;HTML入口设no-cache配合ETag,每次协商,字体和视频按更新频率设周或月,关键是文件名版本化。
动态接口能不能全部不缓存?
不能一刀切,商品价格、库存、榜单这类读多写少且允许短时不一致的接口,适合秒级到分钟级缓存;支付、订单状态、用户资产不缓存或只做本地短缓存,判断标准是“缓存错了会不会造成交易损失”。
小团队先做哪类业务缓存?
先做静态资源长缓存和商品详情页分片缓存,收益直接、风险低;交易链路先不动,上线前用Nginx日志看upstream_cache_status,命中率低的路径先查缓存键和Vary头,静态资源用文件名指纹失效,动态接口用业务事件失效,两套机制分开维护,比全站一个TTL更可控。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/794680.html


