JavaScript (Node.js) 中的缓存:Redis 及其他工具
缓存是提升 Node.js Web 应用程序性能最有效的方法之一。它可以缩短响应时间、降低数据库负载并减少基础设施成本。在本文中,我们将介绍 Node.js 环境中的主要缓存工具:Redis、Memcached 和内置内存缓存。您将了解何时选择哪种工具,并看到可运行的代码示例。
为什么需要在 Node.js 中使用缓存?
Node.js 是单线程但异步的。每次对数据库或外部 API 的请求都是一种等待(I/O)。缓存可以保存昂贵操作(例如复杂的 SQL 查询或 HTML 解析)的结果,并立即返回。主要使用场景包括:
- 保存数据库查询结果(尤其是聚合查询)
- 缓存外部 API 的响应(天气、汇率)
- 存储用户会话
- 临时存储计算数据(例如模板渲染)
1. Redis —— 缓存之王
Redis 是一种内存数据存储,常被用作缓存。它在独立进程中运行,支持复杂的数据结构(字符串、哈希、列表、集合),并内置 TTL(键的生存时间)机制。
安装与连接
需要安装 Redis 服务器(本地或 Docker 中)。在 Node.js 中使用 redis 包:
npm install redis示例:带 TTL 的数据缓存
const redis = require('redis');const client = redis.createClient();
client.on('error', (err) => console.error('Redis error:', err));
// 带缓存的异步数据获取函数async function getCachedData(key, fetchFunction, ttlSeconds = 60) { // 尝试从缓存获取 const cached = await client.get(key); if (cached) { return JSON.parse(cached); }
// 如果没有,则调用昂贵函数 const freshData = await fetchFunction();
// 保存到缓存并设置 TTL await client.setEx(key, ttlSeconds, JSON.stringify(freshData)); return freshData;}
// 使用:缓存数据库查询结果const users = await getCachedData('users:list', () => db.query('SELECT * FROM users'), 120);Redis 的优势
- 高性能(每秒数百万次操作)
- 支持 TTL、发布/订阅、事务
- 持久化(可保存到磁盘)
- 适用于分布式系统(多台 Node.js 服务器)
缺点
- 需要单独的服务器/容器
- 消耗内存
- 对于简单的单线程应用程序来说过于复杂
2. Memcached —— 轻量且快速
Memcached 是另一种流行的内存缓存,但比 Redis 更简单:仅支持字符串,无持久化,无复杂数据结构。非常适合简单的数据缓存。
安装与示例
npm install memcachedconst Memcached = require('memcached');const memcached = new Memcached('localhost:11211');
async function getCachedData(key, fetchFunction, ttlSeconds = 60) { return new Promise((resolve, reject) => { memcached.get(key, async (err, data) => { if (data) return resolve(JSON.parse(data));
const freshData = await fetchFunction(); memcached.set(key, JSON.stringify(freshData), ttlSeconds, (err) => { if (err) reject(err); resolve(freshData); }); }); });}何时使用 Memcached?
- 只需要简单的键值缓存
- 重启后无需保留数据
- 资源有限(Memcached 比 Redis 更轻量)