JavaScript (Node.js) 中的缓存:Redis 及其他工具
缓存是优化 Node.js 服务器端应用程序性能的关键策略之一。它可以降低数据库负载、减少 API 响应时间并降低基础设施成本。在本文中,我们将介绍 Node.js 的主要缓存工具:Redis、Node-Cache(内置库)和 Memcached,比较它们的方法,并展示实际的代码示例。
为什么需要在 Node.js 中进行缓存?
没有缓存,对热门资源的每个请求都可能导致多次访问数据库或外部 API。缓存将频繁请求的数据保存在快速存储(RAM)中,从而带来以下好处:
- 将响应时间(延迟)从 100-500 毫秒降低到 1-5 毫秒。
- 减少对数据库和外部服务的请求次数。
- 提高服务器的吞吐量(RPS)。
1. Redis — 缓存之王
Redis 是一种内存中的键值数据存储,通常用作缓存、消息代理和数据库。在 Node.js 中,使用 redis(或 ioredis)库与 Redis 交互。
安装与连接
npm install redisconst redis = require('redis');const client = redis.createClient({ url: 'redis://localhost:6379'});
client.on('error', (err) => console.error('Redis Error:', err));await client.connect();
// 带 TTL 的数据缓存示例async function getCachedData(key) { const cached = await client.get(key); if (cached) return JSON.parse(cached);
const freshData = { message: 'Hello from DB', time: Date.now() }; await client.setEx(key, 60, JSON.stringify(freshData)); // TTL 60 秒 return freshData;}Redis 针对 Node.js 的特性
- 支持 TTL — 自动删除过期条目。
- 数据结构 — 字符串、列表、集合、哈希、有序集合。
- Pub/Sub — 可以构建实时通知系统。
- 集群 — 水平扩展而不损失性能。
2. Node-Cache — 无需外部依赖的轻量级内存缓存
Node-Cache 是一个简单的库,用于直接在 Node.js 进程的内存中缓存数据。非常适合小型项目、微服务或不想启动 Redis 的场景。
安装与示例
npm install node-cacheconst NodeCache = require('node-cache');const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
// 保存数据myCache.set('user:123', { name: 'Alice', role: 'admin' });
// 获取数据const user = myCache.get('user:123');if (user === undefined) { // 缓存中没有数据 — 需要从数据库加载 console.log('Cache miss');} else { console.log('Cache hit:', user);}
// 按键删除myCache.del('user:123');
// 清空所有缓存myCache.flushAll();Node-Cache 的优缺点
- 优点: 不需要外部服务器,API 简单,支持 TTL 自动清理。
- 缺点: 缓存仅存储在一个进程中 — 服务器重启时数据丢失;无法在多个 Node.js 实例之间共享。
3. Memcached — 开销最小的分布式缓存
Memcached 是另一种流行的内存存储,针对缓存进行了优化。在 Node.js 中,最常使用 memcached 库。
安装与示例
npm install memcachedconst Memcached = require('memcached');const memcac