Node.js 在 Linux 上的缓存策略实施指南
一 分层策略总览
- HTTP 层缓存:通过响应头控制浏览器与中间代理(如 CDN/反向代理)的缓存行为,覆盖静态资源与接口响应。
- 应用层缓存:在 Node.js 进程内用内存或外部缓存(如 Redis/Memcached)降低数据源访问延迟与成本。
- 边缘层缓存:对静态资源使用 CDN,并设置合适的 Cache-Control/ETag,减少回源。
以上分层可组合使用,通常“HTTP 层 + 应用层 + CDN”效果最佳。
二 HTTP 层缓存实施
- 强缓存:设置 Cache-Control: public, max-age=…(如 300 秒),对可缓存资源(图片、字体、带哈希的 JS/CSS、版本化 API 响应)使用;如需兼容 HTTP/1.0 可同时设置 Expires 头。强缓存命中时浏览器不再发请求。
- 协商缓存:当强缓存失效或未命中时,使用 ETag/Last-Modified 与请求头 If-None-Match/If-Modified-Since 配合,服务端比较后返回 304 Not Modified 或 200 与新内容,显著减少传输体积。
- 禁止缓存:对登录页、支付表单、实时数据等敏感或强一致性资源,使用 Cache-Control: no-store, no-cache, must-revalidate,并配合 Pragma: no-cache、Expires: 0 保证旧客户端与代理不缓存。
- 框架示例(Express/Koa/Hapi):
- Express:res.set(‘Cache-Control’, ‘public, max-age=3600’);Koa:ctx.set(‘Cache-Control’, ‘public, max-age=3600’);Hapi:在路由 options.cache 中配置 expiresIn。
- 验证:使用 curl -I 查看响应头是否包含期望的 Cache-Control/ETag/Last-Modified 等字段。
以上做法覆盖强缓存、协商缓存与禁止缓存的典型场景,并给出跨框架设置方法与验证方式。
三 应用层缓存实施
- 内存缓存:进程内对象或轻量库(如 memory-cache)适合热点数据、短 TTL 场景;优点是速度快,缺点是进程重启即失效、多实例不共享。
- 分布式缓存:使用 Redis/Memcached 在多个 Node.js 实例间共享缓存,适合会话、聚合查询结果、频繁读写的业务数据;示例(Redis):client.get(key, (err, data) => { … }),未命中则回源并 client.setex(key, ttl, JSON.stringify(data))。
- 磁盘缓存:将可序列化的结果写入本地文件(fs.writeFileSync/JSON),在内存不足或需跨进程/重启保留时使用;注意 I/O 成本与并发一致性。
以上三种方式可按数据热度与一致性要求组合使用,常见模式是“本地内存 L1 + Redis L2”。
四 静态资源与 CDN 实施
- 资源命名与指纹:为 JS/CSS/图片 等静态资源加入内容哈希(如 app.a1b2c3.js),配合 Cache-Control: public, max-age=31536000, immutable,可长期缓存且无需变更 URL。
- CDN 配置:将静态资源托管到 CDN,在源站设置长 max-age 与 ETag,由 CDN 节点与浏览器协同缓存;对动态接口按需设置 no-store/no-cache 或短 max-age。
通过“文件名哈希 + 长强缓存 + CDN”可显著降低回源率与首屏时间。
五 落地配置与运维建议
- 推荐默认策略
- 静态资源:Cache-Control: public, max-age=31536000, immutable(带哈希);启用 ETag;通过 CDN 分发。
- 版本化 API 响应:Cache-Control: public, max-age=300;配合 ETag/Last-Modified 做协商缓存。
- 用户私有/敏感数据:Cache-Control: no-store, no-cache, must-revalidate;Pragma: no-cache;Expires: 0。
- 实时/频繁变化数据:Cache-Control: no-cache 或 max-age=0,必要时用 ETag 协商。
- 监控与失效
- 为缓存设置合理 TTL 与主动失效(如业务变更时删除对应 Redis 键或更新资源哈希)。
- 对 CDN 与反向代理开启 Cache-Control/ETag 透传与日志,观察命中率与带宽变化。
- 安全与兼容
- 敏感内容务必使用 HTTPS 并配合严格缓存头;部分 CDN/代理 可能忽略或改写缓存头,需在边缘侧再次校验配置。
以上默认策略覆盖常见资源类型,并给出失效、监控与兼容性要点。