学习

3 种设计模式,加速 MEAN 和 MERN 栈应用程序

您将在下面找到电子书中的摘录。点击这里下载完整电子书。

介绍#

如果您没有关注性能设计和构建软件,那么您的应用程序在投入生产后可能会遇到严重的瓶颈。

随着时间的推移,开发社区已经学习了一些通用的技术,这些技术可以作为可靠的**设计模式**来解决已知的难题,包括应用程序性能。

那么什么是设计模式?它们是针对软件系统中反复出现的设计问题提出的建议做法。设计模式包含四个部分:名称、问题描述(模式适用的特定条件集)、解决方案(解决问题的最佳通用策略)以及后果集。

两种已经成为构建 Node.js 应用程序的流行方法的开发栈是**MEAN**栈和**MERN**栈。MEAN 栈由 MongoDB 数据库、Express 和 Angular.js 框架以及 Node.js 组成。它是一个纯 JavaScript 栈,可以帮助开发人员创建网站或应用程序的各个部分。相比之下,MERN 栈由 MongoDB、Express 和 ReactJS 框架以及 Node.js 组成。

这两个栈都运行良好,这也是它们受欢迎的原因。但这并不意味着生成的软件运行得尽可能快——或者运行得尽可能快。

在本文中,我们分享了一种流行的设计模式,开发人员使用 Redis 与 MEAN 和 MERN 栈应用程序一起使用来提高应用程序性能:**主数据查找模式**。我们详细解释了这种模式,并附带概述、典型用例和代码示例。我们的目的是帮助您了解何时以及如何在自己的软件开发中使用这种特定模式。电子书中还包含其他模式,例如**缓存旁路模式**和**写入后模式**

构建电影应用程序#

本教程中使用的演示应用程序展示了一个具有基本创建、读取、更新和删除 (CRUD) 操作的电影应用程序。

电影应用程序仪表板在顶部包含一个搜索部分,在中间包含一个电影卡片列表。当用户选择浮动加号图标时,会显示一个弹出窗口,允许用户输入新的电影详细信息。搜索部分有一个文本搜索栏以及文本搜索和基本搜索(即基于表单的搜索)之间的切换链接。每个电影卡片都有编辑和删除图标,当鼠标悬停在卡片上时,这些图标会显示出来。

本教程使用一个 GitHub 示例演示,该演示使用以下工具构建

  • 前端: ReactJS (18.2.0)
  • 后端: Node.js (16.17.0)
  • 数据库: MongoDB
  • 缓存和数据库: Redis stack (使用 Docker)
GITHUB 代码

以下是克隆本教程中使用的应用程序(前端和后端)的源代码的命令

git clone https://github.com/redis-developer/ebook-speed-mern-frontend.git

git clone https://github.com/redis-developer/ebook-speed-mern-backend.git

主数据查找模式#

要从 Redis 提供主数据,请预加载来自 MongoDB 的数据。

  1. 1.在应用程序启动时从 MongoDB 读取主数据,并在 Redis 中存储数据副本。这将预先缓存数据,以便快速检索。使用脚本或 cron 作业来重复地将主数据复制到 Redis。
  2. 2.应用程序请求主数据。
  3. 3.主数据将从 Redis 提供,而不是从 MongoDB 提供。

用例#

当您需要以下情况时,请考虑使用此模式

  • 以速度提供主数据:根据定义,几乎每个应用程序都需要访问主数据。使用 Redis 预先缓存主数据可以高速向用户提供主数据。
  • 支持大型主表:主表通常包含数百万条记录。在其中搜索可能会导致性能瓶颈。使用 Redis 对主数据进行实时搜索,以毫秒级的响应速度提高性能。
  • 推迟昂贵的硬件和软件投资:通过使用 Redis 延迟昂贵的基础设施增强。获得性能和扩展优势,而无需让 CFO 开支票。

演示#

下图说明了一种标准方法,用于展示适合主数据查找的 UI。负责此应用程序的开发人员会将某些字段视为主数据,包括电影语言、国家、流派和评分,因为它们是常见应用程序事务所必需的。

考虑当用户想要添加一部新电影并点击电影应用程序的加号图标时出现的弹出对话框。弹出窗口包括国家和语言的下拉菜单。在本演示中,Redis 加载这些值。

代码#

下面的两个代码块显示了从 MongoDB 和 Redis 中提取主数据的 fetch 查询,该查询加载了国家和语言下拉值。

以前,如果应用程序使用 MongoDB,它会搜索静态数据库以检索电影的国家和语言值。如果从持久存储中读取,这可能会很耗时——如果信息是静态的,则效率低下。

*** BEFORE (MongoDB)***
*** MongoDB regular search query ***
function getMasterCategories() {
  ...
  db.collection("masterCategories").find({
    statusCode: {
      $gt: 0,
    },
    category: {
      $in: ["COUNTRY", "LANGUAGE"],
    },
  });
  ...
}

相反,代码块中的“之后”视图显示主数据只需几行代码即可访问——并且响应时间快得多。

*** AFTER (Redis) ***
*** Redis OM Node query ***
function getMasterCategories() {
  ...
  masterCategoriesRepository
    .search()
    .where("statusCode")
    .gt(0)
    .and("categoryTag")
    .containOneOf("COUNTRY", "LANGUAGE");
  ...
}

下载电子书#

这里发现模式了吗?主数据查找模式并不是您可以用来提高应用程序性能的唯一设计模式。

我相信您渴望了解更多信息,因此请点击这里下载完整电子书。