引言:为什么需要 JavaScript 缓存
现代基于 Node.js 的 Web 应用每天处理数百万次请求。如果没有适当的缓存,每次对数据库或外部 API 的调用都会产生延迟,增加服务器负载,并降低用户体验。缓存是一种将频繁请求的数据临时存储在快速存储中的技术,这样后续请求就不必再执行繁重的操作。
在 JavaScript (Node.js) 生态系统中,主要有三种缓存方法:
- 内置解决方案(内存缓存) — 简单库,将数据存储在 Node.js 进程的内存中。
- Memcached — 一种运行在 RAM 中的分布式缓存系统。
- Redis — 一种高级的内存数据存储,支持复杂的数据结构。
在本文中,我们将详细分析每种方法,提供 JavaScript 代码示例,并帮助您为项目选择最佳解决方案。
Node.js 内置缓存解决方案
组织缓存的最简单方法是使用 JavaScript 内置功能或轻量级库。此类解决方案无需安装外部服务,非常适合小型项目或原型。
简单对象缓存
使用普通 JavaScript 对象进行缓存的基本示例:
class SimpleCache { constructor() { this.cache = {}; }
get(key) { return this.cache[key]; }
set(key, value, ttl = 60000) { this.cache[key] = value; setTimeout(() => { delete this.cache[key]; }, ttl); }
delete(key) { delete this.cache[key]; }
clear() { this.cache = {}; }}
// 使用示例const cache = new SimpleCache();cache.set('user:123', { name: 'Anna', role: 'admin' }, 30000);console.log(cache.get('user:123')); // { name: 'Anna', role: 'admin' }这种方法的缺点:没有自动内存清理,键数量多时容易内存泄漏,不支持分布式缓存。
node-cache 库
更高级的选项是使用 node-cache 包:
const NodeCache = require('node-cache');const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
// 保存数据myCache.set('key', { data: 'value' });
// 获取数据const value = myCache.get('key');if (value === undefined) { // 未找到数据 — 需要从数据库获取 console.log('缓存未命中');} else { console.log('缓存命中:', value);}
// 按键删除myCache.del('key');
// 统计信息console.log(myCache.getStats());node-cache 支持 TTL(生存时间)、过期键自动清理和基本统计信息。但它不适用于多进程应用——每个 Node.js 进程都存储自己的数据副本。
Memcached:轻量级分布式缓存
Memcached 是一个高性能的分布式 RAM 对象缓存系统。它非常适合缓存数据库查询结果、用户会话和 HTML 片段。
安装和连接 Memcached
首先,安装 Memcached 服务器和 Node.js 客户端:
# 安装服务器 (Ubuntu/Debian)sudo apt-get install memcached
# 安装 Node.js 客户端npm install memcached在 Node.js 中使用 Memcached 的示例
const Memcached = require('memcached');const memcached = new Memcached('localhost:11211');
// 保存带有 TTL(秒)的数据memcached.set('user:456', { name: 'Ivan', email: 'ivan@example.com' }, 3600, (err) => { if (err) console.error('保存出错:', err);});
// 获取数据memcached.get('user:456', (err, data) => { if