Node.js 中的缓存 (Caching)

2025 年 5 月 1 日 | 阅读 5 分钟

引言

通过将经常使用的数据保留在内存或其他存储系统中,Node.js 中的缓存对于提高在线应用程序的效率和可扩展性至关重要。这包括渲染 HTML 页面、数据库搜索、API 调用响应以及其他计算密集型操作。这些数据可以被缓存起来,以便在后续调用相同信息时加快速度,从而减少不必要的计算或数据库查询。

Node.js 提供了多种缓存实现技术,每种技术都针对特定的用例和性能要求。内存缓存是一种流行的技术,数据在 Node.js 进程中保留在内存中。

通常使用 JavaScript 对象等数据结构或 node-cache 或 memory-cache 等特定缓存库来实现。对于小到中型数据集,这些数据经常被访问,并且不需要在程序重新启动时持久化,内存缓存是一个很好的选择。

Caching in Node.js

另一种策略是使用外部缓存解决方案,如 RedisMemcached。这些是免费的、内存中的键值存储,可以被多个 Node.js 进程以及独立的服务器访问。通过将处理外包给 Redis 或 Memcached 等专用服务,应用程序可以获得集中的缓存管理、数据持久性和可扩展性。

缓存可以在应用程序堆栈的多个级别上使用,包括:

  1. 应用程序级缓存:通过在 Node.js 应用程序代码中使用外部缓存库或内存数据结构来实现。这种级别的缓冲非常适合缓存应用程序特定数据或计算结果。
  2. 数据库查询缓存:缓存经常运行的数据库查询的结果,以减轻数据库服务器的负担并加快对大量读取工作负载的响应时间。Sequelize 和 Mongoose 等库都支持查询缓存。
  3. HTTP 响应缓存:可以在 Web 服务器或通过反向代理缓存 HTTP 响应,以便直接提供缓存的响应,而无需触及 Node.js 应用程序。可以使用 Varnish 或 CDN(内容分发网络)服务等缓存代理,以及 Cache-Control 标头等存储指令来实现。

安装 Node.js 缓存

我们可以使用此命令安装 node-cache

示例

让我们看一个 Node.js 中缓存的示例。

输出

 
Data retrieved from database
{ key: 'value' }
Data retrieved from cache
{ key: 'value' }
Data retrieved from database
{ key: 'value' }   

说明

随附的 Node.js 代码演示了使用 NodeCache 模块缓存数据的基本方法。缓存是一种广泛用于提高速度的方法,通过将经常请求的数据保留在内存中,从而无需从数据库等源头不断地检索信息。

该代码的核心是 NodeCache 模块,它提供了一个简单的内存缓存解决方案。它使用 Const myCache = new NodeCache() 初始化,这会创建一个名为 myCache 的缓存实例来存储键值对。

为了模拟从数据库检索数据,该程序构建了一个名为 fetchDataFromDatabase 的方法。此函数通过返回一个 Promise 来模拟从数据库获取数据所需的时间,该 Promise 在等待 2 秒后以模拟数据对象解析。

getData 函数处理从数据库或缓存检索数据的核心逻辑。它首先使用 myCache.get("data") 检查所需数据是否在缓存中。如果数据在缓存中(cachedData 为真),则从缓存中检索数据并通过控制台报告已从缓存中检索到数据的消息。

如果数据不在缓存中(称为缓存未命中),则函数会记录一条消息,说明数据将从数据库中检索。然后,它通过等待 fetchDataFromDatabase() 的结果来模拟异步从数据库检索数据。检索到数据后,使用 myCache.set("data", newData, 10) 缓存数据,并设置 10 秒的缓存过期时间。然后将检索到的数据提供给调用者。

结论

总之,缓存可以显著提高 Node.js 应用程序的性能并减轻数据库等外部资源的负担。通过将经常使用的数据保留在内存中,缓存可以加快响应和检索时间,从而提高整体用户体验。

在示例中,NodeCache 模块通过提供内存数据存储解决方案,简化了键值对数据的存储和检索。开发人员可以通过减少从数据库等较慢的数据源不断检索数据的需要,从而提高应用程序的效率。

然而,在数据新鲜度和缓存之间找到平衡至关重要。如果缓存的数据未及时刷新,它可能会过时,用户可能会看到过时信息。必须仔细考虑缓存失效技术和过期时间,以确保数据准确且最新。

此外,Node.js 应用程序的速度优化不仅仅是缓存。为了获得最佳性能,还应考虑其他策略,包括限制网络请求、优化数据库查询和使用高效算法。

Node.js 中的缓存是增强应用程序可扩展性和性能的宝贵工具,使开发人员能够在有效利用系统资源的同时,为用户提供更快、更具响应性的体验。