JavaScript中的缓存:Redis、Memcached及内置解决方案从A到Z

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

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

开始课程

JavaScript中的缓存:Redis、Memcached及内置解决方案:从A到Z

\n\n

缓存是提升Web应用程序性能的关键工具之一。在JavaScript和Node.js的上下文中,合理的缓存可以降低数据库负载、减少API响应时间并改善用户体验。在本文中,我们将探讨三种主要方法:进程内内存缓存、Memcached和Redis。您将了解何时选择哪种工具,并获得现成的代码示例。

\n\n

为什么Node.js需要缓存?

\n

Node.js是一个单线程、异步I/O的环境。每次对数据库或外部API的请求都需要时间。缓存允许将频繁请求的数据存储在快速存储(内存)中,并在无需重复执行繁重操作的情况下提供这些数据。这对于以下方面尤其重要:

\n
    \n
  • 减少重复请求时的延迟
  • \n
  • 降低数据库(PostgreSQL、MongoDB等)的负载
  • \n
  • 节省服务器计算资源
  • \n
  • 提高应用程序的吞吐量
  • \n
\n\n

Node.js中的内置缓存(In-Memory Cache)

\n

最简单的方法是使用全局作用域中的Map或Object对象。这适用于小型项目或生命周期仅限于单个进程的数据。

\n\n

示例:使用Map的简单缓存

\n
const cache = new Map();\n\nfunction getCachedData(key) {\n  if (cache.has(key)) {\n    const entry = cache.get(key);\n    if (Date.now() < entry.expiry) {\n      return entry.data;\n    } else {\n      cache.delete(key); // 删除过期数据\n    }\n  }\n  return null;\n}\n\nfunction setCachedData(key, data, ttlMs = 60000) {\n  cache.set(key, {\n    data,\n    expiry: Date.now() + ttlMs\n  });\n}\n\n// 使用:\nsetCachedData('user:123', { name: 'Alice' }, 30000);\nconst user = getCachedData('user:123');\nconsole.log(user); // { name: 'Alice' }
\n\n

优点:简单、零网络延迟、无需安装额外服务。
\n缺点:数据不能在多个进程/服务器之间共享,受限于单个进程的内存。

\n\n

Memcached:分布式缓存

\n

Memcached是一个高性能的分布式内存缓存系统。它简单、快速,非常适合存储小量数据(例如会话或HTML片段)。对于Node.js,有一个流行的模块memcached。

\n\n

安装与连接

\n
npm install memcached
\n\n

使用Memcached的示例

\n
const Memcached = require('memcached');\nconst memcached = new Memcached('localhost:11211');\n\n// 写入数据并设置TTL(以秒为单位)\nmemcached.set('user:456', { name: 'Bob' }, 3600, (err) => {\n  if (err) console.error('写入错误:', err);\n});\n\n// 读取数据\nmemcached.get('user:456', (err, data) => {\n  if (err) {\n    console.error('读取错误:', err);\n  } else if (data) {\n    console.log('缓存中的数据:', data);\n  } else {\n    console.log('缓存为空——未找到数据');\n  }\n});\n\n// 程序退出时关闭连接\nprocess.on('SIGINT', () => {\n  memcached.end();\n});
\n\n

优点:API简单、速度快、支持服务器间分布。
\n缺点:没有内置复制功能,重启时数据丢失,支持的数据类型有限。

\n\n

Redis:功能强大的缓存,支持高级特性

\n

Redis不仅仅是一个缓存,而是一个功能完备的内存数据存储,支持复杂的数据结构(字符串、列表、集合、哈希)。它支持持久化、复制和事务。对于Node.js,我们使用redis库。

\n\n

安装

\n
npm install redis
\n\n

示例:使用Redis进行缓存

博客

书籍推荐