通过这篇简短的介绍性文章,我想提到如何使用Redis在Node.js应用程序中实现缓存,以及我们的应用程序如何从性能中受益。

简而言之,我们可以说高速缓存是将数据临时存储在存储组件区域以便更快地用于未来的过程。 例如。 如果我们有一些来自第三方API的数据,并且这些数据不会在“不久的将来”更改,则可以在检索到数据后将它们存储在缓存中,并避免不必要的服务调用。 这样,我们就不必等待API调用完成了,因为我们已经有了它们,我们可以从缓存中检索它们。 这将使我们的应用程序更快,性能更高。什么是Redis?

Redis是一个高性能的开源NoSQL数据库,主要用作各种类型的应用程序的缓存解决方案。 令人惊讶的是,它将所有数据存储在RAM中,并保证了高度优化的数据读写。 在开始描述如何在Node.js应用程序中实现缓存之前,让我们首先看看Redis.io如何定义其数据库。

Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。 它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。 Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

今天,我将在向第三方API请求数据的Node.js应用程序上实现一种非常简单的缓存机制。 更具体地说,我将使用GitHub的API来获取用户的公共存储库的数量。 因此,让我们开始吧。

如果你的本地计算机上已经安装了Redis,或者你正在使用Redis云解决方案,则可以跳过此步骤。

可以使用Homebrew在Mac上安装Redis。 如果Mac上未安装Homebrew,则可以在终端上运行以下命令进行安装。

还可以从上获得关于如何在Linux机器上安装Redis的简短指南,该指南非常容易理解,请查看。

如前所述,我们将创建一个简单的Node.js应用程序,该应用程序将通过GitHub API检索GitHub用户的公共存储库数量。

首先,我们需要为Node.js应用程序创建一个新文件夹。 之后,我们可以通过在命令提示符下键入以下命令来初始化应用程序,以创建默认的package.json文件。

或者,我们可以运行npm init并按照指南根据需要初始化package.json文件。

之后,我们将生成一个package.json文件,该文件将类似于以下文件。

我们将继续通过运行npm i安装所有必需的依赖项。 在本文中,我将使用三个依赖项,并使用下一个命令安装它们。

· ·Express:如npm所述,express是Node的一种快速,不受质疑的,极简的Web框架。 你可以在这里找到更多。

·Redis:同样,来自npm,Redis是Node的完整且功能丰富的Redis客户端。 它支持所有Redis命令,并专注于高性能。

为了不必手动刷新我们的开发服务器,我们将为开发安装一个额外的依赖项。 它称为nodemon。

·Nodemon:每年,Nodemon是一个工具,可在检测到目录中的文件更改时通过自动重新启动应用程序来帮助开发Node应用程序,在这里找到更多

安装完所有必需的依赖项后,我们可以在pacakge.json文件中创建一个启动脚本,以帮助我们使用nodemon启动应用程序。 因此,在package.json文件中,创建一个如下所示的新脚本。

index.js文件是我们应用程序的起点。 下一步是通过运行touch index.js在与package.json文件相同的文件夹中创建此文件。 之后,我们的package.json文件应如下所示:

此时,我们可以开始实现我们的应用程序了。 我们首先为程序包声明三个变量并导入它们。

下一步是创建一个.env文件,其中将包含我们的服务器和Redis客户端的端口号。

上面的代码检查环境变量是否存在。 否则,它将设置默认值。 要使用这些变量而无需更多服务器自定义,我们可以使用另一个名为dotenv的dev依赖项。 从那里,我们可以使用以下命令安装它:

我们可以通过执行npm run start命令来验证我们的应用程序是否正常运行; 我们应该在终端中看到以下输出。

创建开发服务器之后,必须创建Redis客户端和Express应用程序。 我们可以使用以下代码来实现。

接下来,我们需要创建一条路由,服务器将在该路由中侦听并响应GitHub用户的公共存储库总数。 为此,我们将添加一些新的代码行。

如你所见,我们正在获取数据,并将其作为响应发送回客户端。 在这一点上,我们没有使用缓存机制,而是在使用Redis客户端来存储检索到的数据。 这是在上述代码块的第11行上实现的。

我们使用Redis驱动程序的setx方法,该方法允许我们为存储的数据设置过期时间。 在我们的例子中,我们将其设置为3600 /秒,即一小时。

为了最大化我们的应用程序性能,我们将实现一个缓存中间件,该中间件将在请求新数据之前在Redis本地服务器上搜索密钥。 这就是我们在Node.js应用程序中创建缓存的方式。

我想提一下,这不是实现缓存的唯一方法。 它可能取决于其他应用程序逻辑或你的首选项,但是,本教程是向你展示Redis如何在Node.js应用程序上工作的好方法。

在添加缓存中间件之前,让我们运行我们的应用程序并检查服务请求所花费的总时间。

在不使用高速缓存的情况下,这是一秒钟的正常响应时间。 让我们看看如果添加Redis缓存中间件将会如何。

正如我们已经提到的,下一步是创建一个缓存机制,以将检索到的数据存储“一会儿”,并避免不必要的API调用。

注意! 仅当我们将要接收的数据频繁更改时,才建议使用缓存。 例如,如果我们调用的API的调用数据可能会发生变化,那么使用缓存就不合适了。

该函数正在从Redis服务器中请求一个密钥(在我们的示例中为GitHub用户名),以获取该密钥的缓存数据。 如果找不到密钥,则通过从GitHub API询问数据来继续请求。

现在,让我们使用npm run start命令再次运行该应用程序。 (请注意请求的总时间。)

我们可以看到使用缓存时有很大的不同。 仅花费了4毫秒,而没有它则花费了1秒。 原因是我们之前已经检索过此数据,并且已将它们以Redis作为键值对存储在内存中。 每次我们调用此终结点直到1小时,服务器都不会向GitHub API发出真正的请。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注