JavaScript中的缓存:Redis、Memcached及Node.js内置解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript中的缓存:Redis、Memcached和内置解决方案



缓存是优化Web应用程序性能的关键策略之一。在JavaScript生态系统中(尤其是Node.js),开发者可以使用强大的工具:从内置机制到Redis和Memcached等分布式系统。在本文中,我们将通过实际代码示例,分析如何以及何时使用每种方法。



为什么在Node.js中需要缓存?

没有缓存,每个服务器请求都可能导致昂贵的操作:读取数据库、复杂计算或调用外部API。缓存保存第一个请求的结果,并在后续请求时返回它。这减少了服务器负载,缩短了响应时间,并改善了用户体验。



Node.js中缓存的主要使用场景:

  • 数据库查询结果(尤其是聚合查询)
  • 外部API响应(天气、汇率)
  • 繁重计算(生成报告、图像处理)
  • 用户会话和身份验证令牌


JavaScript (Node.js) 中的内置缓存

最简单的方法是使用Map或Object对象在进程内存中存储数据。这很快,但有局限性:数据只在服务器运行时存在,且内存不受限制。



示例:带TTL(生存时间)的Map缓存

class SimpleCache {    constructor(ttl = 60000) {        this.cache = new Map();        this.ttl = ttl; // 生存时间(毫秒),默认1分钟    }

set(key, value) { this.cache.set(key, { value, timestamp: Date.now() }); }

get(key) { const item = this.cache.get(key); if (!item) return null; if (Date.now() - item.timestamp > this.ttl) { this.cache.delete(key); return null; } return item.value; }

delete(key) { this.cache.delete(key); }

clear() { this.cache.clear(); }}

// 使用const cache = new SimpleCache(30000); // 30秒cache.set('user_123', { name: 'Иван', role: 'admin' });const user = cache.get('user_123');console.log(user); // { name: 'Иван', role: 'admin' }


优点:零延迟,简单,不需要外部依赖。
缺点:重启时数据丢失,受限于单个进程的内存,不适合分布式系统。



对于更高级的内置缓存,可以使用node-cache包,它增加了自动清理、统计信息和字符串键支持。



Redis:用于Node.js的分布式缓存

Redis是一种内存数据存储,通常用作缓存。在Node.js中,使用ioredis包(比redis更现代)来操作Redis。



安装和基本连接

npm install ioredis


const Redis = require('ioredis');const redis = new Redis({    host: 'localhost',    port: 6379,    // password: 'your-password' // 如果需要});

redis.on('connect', () => console.log('已连接到Redis'));redis.on('error', (err) => console.error('Redis错误:', err));


示例:带TTL的数据缓存

const Redis = require('ioredis');const redis = new Redis();

async function getCachedData(key, fetchFunction, ttl = 3600) { // 尝试从缓存获取 const cached = await redis.get(key); if (cached) { return JSON.parse(cached); }

// 如果没有,获取数据并保存 const data = await fetchFunction(); await redis.setex(key, ttl, JSON.stringify(data)); return data;}

// 使用示例:缓存

博客

书籍推荐