温馨提示×

Linux下Node.js的缓存策略如何设置

小樊
32
2025-12-06 13:06:45
栏目: 编程语言

Linux下Node.js缓存策略设置

一 概览与分层

  • Linux 上,Node.js 的缓存通常分为三层:
    1. HTTP 缓存(通过响应头控制浏览器与代理);
    2. 应用层缓存(内存或分布式缓存,如 LRURedis);
    3. 构建与包管理缓存(如 npm 本地缓存)。
  • 操作系统与部署环境(如 NginxCDN)也会参与缓存,需与 Node.js 侧策略协同。

二 HTTP缓存控制

  • 常用响应头与含义
    • Cache-Control:核心指令,如 public / private / no-cache / no-store / max-age=秒 / immutable
    • ETag:资源唯一标识,配合 If-None-Match 实现 304;
    • Last-Modified / If-Modified-Since:时间戳验证,配合 304;
    • 兼容性头:Pragma: no-cache(HTTP/1.0)、Expires: 0
  • 示例(按场景设置)
    • 禁止缓存(登录、支付、验证码等敏感页面)
      • 推荐组合:Cache-Control: no-store, no-cache, must-revalidatePragma: no-cacheExpires: 0
      • Express 全局中间件示例:
        • const express = require(‘express’); const app = express(); app.use((req,res,next)=>{ res.setHeader(‘Cache-Control’,‘no-store, no-cache, must-revalidate’); res.setHeader(‘Pragma’,‘no-cache’); res.setHeader(‘Expires’,‘0’); next(); }); app.listen(3000);
    • 可缓存的静态资源(带协商缓存与强缓存)
      • 推荐:Cache-Control: public, max-age=31536000, immutable(一年,配合文件名哈希);
      • 同时输出 ETag / Last-Modified,在命中时返回 304
    • 需要每次验证但允许使用本地副本
      • Cache-Control: no-cache(每次向服务器验证,配合 ETag/Last-Modified 返回 304)。
    • 框架示例(按路由设置)
      • Express:res.set(‘Cache-Control’,‘public, max-age=3600’);
      • Koa:ctx.set(‘Cache-Control’,‘public, max-age=3600’);
      • Hapi:在路由 options 中设置 cache.expiresIn(如 3600 秒)。

三 应用层缓存

  • 内存缓存(进程内)
    • 使用 node-cachelru-cache 缓存热点数据,降低计算与 I/O。
    • 示例(node-cache):
      • const NodeCache = require(‘node-cache’); const cache = new NodeCache({ stdTTL: 600, checkperiod: 120 }); cache.set(‘k’,‘v’); const v = cache.get(‘k’);
    • 示例(lru-cache):
      • const LRU = require(‘lru-cache’); const cache = new LRU({ max: 100, maxAge: 10006060 });
  • 分布式缓存(跨进程/多实例)
    • 使用 Redis(或 Memcached)共享缓存,适合集群与多实例部署。
    • 示例(Redis):
      • const redis = require(‘redis’); const client = redis.createClient(); client.get(‘k’,(err,reply)=>{ reply && res.json(JSON.parse(reply)); }); client.set(‘k’,JSON.stringify(data));
  • 适用场景:接口聚合结果、数据库查询结果、模板渲染片段、会话/验证码等。

四 构建与包管理缓存

  • npm 本地缓存
    • 查看与清理:
      • npm cache verify(校验);npm cache clean --force(清理);
    • 调整缓存目录(可选):npm config set cache <路径>。
  • 构建产物缓存
    • 使用 webpack/Vite 等带 持久化缓存(如 cache-loader、文件系统缓存)以加速 CI/CD 与本地开发。
  • 反向代理与 CDN
    • NginxCDN 上为静态资源设置长 Cache-Control(如 public, max-age=31536000, immutable),并通过文件名哈希或查询串实现更新;动态接口走协商缓存或不缓存。

五 验证与运维建议

  • 验证方法
    • 使用 cURL 检查响应头:curl -I https://your-domain/asset.js;
    • 关注 Cache-Control / ETag / Last-Modified / Expires 是否符合预期;
    • 触发条件请求,确认返回 304 而非 200
  • 运维要点
    • 为静态资源启用 文件名哈希 或版本号,避免强缓存导致更新不可达;
    • 动态接口优先 no-cache + ETag/Last-Modified,必要时结合 Vary 区分内容协商;
    • 集群环境优先 Redis 等分布式缓存,避免单实例内存缓存不一致;
    • 上线前在 Nginx/CDN 与 Node.js 两侧核对缓存策略一致性。

0