在 Ubuntu 上配置 Node.js 缓存策略
一 概念与目标
- 面向 Node.js 的缓存通常包含三类:
- 依赖安装缓存:npm/Yarn 的下载与解压缓存,影响安装速度与磁盘占用。
- HTTP 运行时缓存:通过响应头控制浏览器与 CDN/反向代理的缓存行为。
- 数据层缓存:进程内或外部缓存(如 Redis)降低数据库压力、提升响应。
二 配置依赖安装缓存
- 选择合适目录并配置 npm 缓存路径(示例将缓存放到 /opt/node-cache):
- 创建目录并赋权:
- sudo mkdir -p /opt/node-cache
- sudo chown -R $USER:$USER /opt/node-cache
- 配置 npm 使用该目录(写入用户级配置,避免需要 sudo):
- npm config set cache /opt/node-cache
- 验证:npm config get cache 应返回 /opt/node-cache
- 如需自定义全局包目录(可选,避免与系统目录混用):
- npm config set prefix /opt/node-global
- 将 /opt/node-global/bin 加入 $PATH(写入 ~/.bashrc 或 /etc/profile.d/node.sh):
- echo ‘export PATH=/opt/node-global/bin:$PATH’ >> ~/.bashrc && source ~/.bashrc
- 使用 Yarn 时(可选):
- 设置缓存目录:yarn config set cache-folder /opt/yarn-cache
- 验证:yarn config get cache-folder
- 清理无用的包缓存(维护时执行):
- 说明:Node.js 运行时本身不处理 HTTP 缓存,HTTP 缓存需由框架/中间件设置响应头实现。
三 配置 HTTP 缓存策略
- 在 Express 中按路由设置 Cache-Control,区分静态资源与动态接口:
- 静态资源(长期缓存,配合文件名哈希):
- app.use(‘/static’, express.static(‘public’, {
maxAge: ‘365d’,
immutable: true
}));
- 动态接口(不缓存或短缓存):
- app.get(‘/api/data’, (req, res) => {
res.set(‘Cache-Control’, ‘no-store’); // 或 ‘private, max-age=60’
res.json({ ts: Date.now() });
});
- 在 Koa 中使用 ctx.set 设置相同响应头;在 Hapi 可在路由 options 中配置缓存插件或 cache.expiresIn。
- 建议组合策略:
- 对带内容哈希的静态资源使用:public, max-age=31536000, immutable
- 对频繁变动的页面/接口使用:no-store 或 private, max-age=0, must-revalidate
- 对可共享但对单用户私有的数据:private, max-age=60
四 配置数据层缓存
- 以 Redis 为例,作为外部缓存提升读多写少场景的性能:
- 安装与启动:
- sudo apt update && sudo apt install -y redis-server
- sudo systemctl enable --now redis-server
- redis-cli ping 应返回 PONG
- 在 Node.js 中使用 ioredis 读写缓存(TTL 示例为 60 秒):
- 安装:npm i ioredis
- 代码示例:
- const Redis = require(‘ioredis’);
- const redis = new Redis();
- async function getData(id) {
const key =
user:${id};
let data = await redis.get(key);
if (data) return JSON.parse(data);
data = await db.query(‘SELECT …’); // 伪函数
await redis.set(key, JSON.stringify(data), ‘EX’, 60);
return data;
}
- 适用场景:会话存储、热点数据、计算结果、接口响应缓存等。
五 持续集成中的缓存优化
- 在 GitHub Actions 等 CI 中缓存依赖目录,显著缩短安装耗时:
- 示例(npm):
-
- uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles(‘**/package-lock.json’) }}
restore-keys: ${{ runner.os }}-node-
- 可叠加缓存构建产物目录(如 dist/、build/)以加速后续步骤。