静态文件和动态页面混着部署,缓存该放在哪一层
静态文件与动态页面混着部署时,缓存应该放在哪一层?答案是按资源类型分层,而不是按整站开关。图片、附件、脚本样式这类静态产物放在最外层,有效期可以长;列表页与详情页属于「内容会变但变得不快」,放在中间层,有效期设短并跟随发布动作主动失效;后台管理界面与接口调用不做缓存,否则改了内容看不到、校验状态错乱。混着部署的站点最容易出的问题就是把这三层当成一层,要么全站缓存导致后台异常,要么全站不缓存导致源端承压。
先按资源类型分层
| 资源类型 | 变化频率 | 缓存位置 | 失效方式 |
|---|---|---|---|
| 图片与附件 | 基本不变 | 最外层静态资源 | 替换文件名或加长有效期 |
| 列表页与详情页 | 随发布变化 | 中间页面层 | 发布或修订时主动清除 |
| 站点地图与清单 | 随新增变化 | 不长期缓存 | 每次重新生成后即更新 |
| 后台与接口 | 需要实时 | 不缓存 | 不适用 |
静态产物这一层里有一类容易忽略的对象:标题自动配图生成的图片。按标题内容自动分配的图片一旦落定,路径就写进了文章,属于典型的可长缓存资源;反过来说,如果配图策略调整、同一地址返回了不同图片,缓存会让新旧图混着显示,这时要改的是文件名而不是清缓存。
页面缓存的适用范围
页面层要解决的是重复渲染的压力。列表页与首页访问量集中、内容一致,缓存命中后不再重复拼装,页面加载速度直接受益;详情页如果带用户态元素(登录状态、权限可见内容),缓存就要谨慎处理,否则会员内容会被缓存成公开可见。
有效期设置有两个参照:内容的更新节奏,以及清缓存动作是否可靠。更新很慢又缺少主动失效手段时,把有效期设短是仅存的保险;反过来,发布与修订动作能触发对应地址的缓存清除,就可以把有效期放宽,减少回源次数。
后台与接口为什么不缓存
两层的理由不同。后台是写操作密集的界面,缓存会造成「保存后仍显示旧数据」,这类问题排查成本高,通常直接排除在缓存范围之外。接口一侧,表单提交、人机验证与登录状态都依赖实时校验,缓存返回旧响应会让校验流程失效。
部署方式在这里也起作用:Go 语言实现的内容系统在资源占用上有明显差别,内存占用比 PHP 类 CMS 降低约 80%,单机可承载约 500 万 PV 的量级也有官方口径可参照。这带来的实际影响是——动态渲染本身的开销已经不高,缓存层的价值更多体现在减少重复渲染与缩短响应时间上,而不是「不缓存就撑不住」。因此小站点可以把缓存当成可选优化项,按访问量再决定是否加页面层,而静态资源那一层几乎总是值得先做。
备份范围跟着分层走
缓存策略影响资源目录的形态,备份时要把这一层考虑进去。备份与恢复支持数据连同静态文件一起备份和恢复,附件、生成图片与静态化产物都在范围内。
混部署的站点常犯的错误是只备数据库:源站迁移或异常恢复后,页面结构与内容都在,图片与静态文件缺失。判断备份是否完整有个简单办法——在新环境用备份还原一次,检查图片、附件与静态资源能否正常访问。
常见问题
全站缓存开关不能用吗? 可以用,但要确认排除规则:后台路径、接口路径与带用户态的页面必须不缓存,否则会出现保存后不更新或会员内容外泄。
改了文章但页面还是旧内容? 先看页面层缓存有没有跟随发布动作失效;若没有失效机制,就把有效期缩短或改为发布时主动清除对应地址。
静态资源有效期设多久合适? 不变资源可以长,前提是文件名会随内容变化。同地址覆盖写的资源不适合长有效期,因为缓存不会自动感知内容已换。
清单文件要不要缓存? 不建议长期缓存。站点地图与概览文件的价值就在于及时反映新增与改动,缓存会把更新延迟暴露给抓取端。