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

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

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

开始课程

引言:为什么需要 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

博客

书籍推荐