以下是克隆本教程中使用的应用程序(前端和后端)源代码的命令
git clone https://github.com/redis-developer/ebook-speed-mern-frontend.git
git clone https://github.com/redis-developer/ebook-speed-mern-backend.git
缓存预取是在数据库管理系统 (DBMS) 中使用的一种技术,通过在查询明确请求数据之前预测和获取存储子系统中的数据来提高查询性能。
缓存预取主要有三种策略
本教程将涵盖第三种策略,即 基于数据访问模式的预取。
假设您正在构建一个电影流媒体平台。您需要能够为用户提供一个仪表板,使他们能够快速找到要观看的电影。您有一个包含大量电影的数据库,并且您按产地、类型、语言等对它们进行分类。此数据变化频率很低,并且在您的应用程序和其他数据中经常被引用。这种存活时间长且变化频率低的类型数据被称为“主数据”。
开发人员面临的一个持续挑战是快速创建、读取、更新和删除主数据。您可能将主数据存储在诸如 SQL 数据库或文档数据库之类的系统记录中,然后使用 Redis 作为缓存来加速对该数据的查找。然后,当应用程序请求主数据时,主数据不是来自系统记录,而是来自 Redis。这被称为“主数据查找”模式。
从开发人员的角度来看,“主数据查找”是指在业务事务中、在应用程序设置中以及软件以任何其他方式检索信息时访问主数据的过程。主数据查找的示例包括为用户界面 (UI) 元素(例如下拉对话框、选择值、多语言标签)获取数据,获取常量,获取用户访问控制,获取主题以及其他产品配置。
下面是使用 Redis 和 MongoDB 作为系统记录的预取主数据的数据流图。
获取数据的步骤如下
如果您使用 Redis Cloud,由于其对 JSON 和搜索的支持,缓存预取变得更加容易。您还可以获得其他功能,例如实时性能、高可扩展性、弹性和容错能力。您还可以使用高可用性功能,例如主动-主动地理冗余。
本教程其余部分中使用的演示应用程序展示了一个带有基本创建、读取、更新和删除 (CRUD) 操作的电影应用程序。
电影应用程序仪表板在顶部包含一个搜索部分,在中间包含一个电影卡片列表。当用户选择浮动加号图标时,它将显示一个弹出窗口,允许用户输入新的电影详细信息。搜索部分包含一个文本搜索栏和一个文本搜索与基本搜索(即基于表单的搜索)之间的切换链接。每个电影卡片都包含编辑和删除图标,当鼠标悬停在卡片上时会显示这些图标。
以下是克隆本教程中使用的应用程序(前端和后端)源代码的命令
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 JSON 文档并将它们存储在 Redis(作为 JSON)中,使用 用于 Node.js 的 Redis OM 库。
async function insertMasterCategoriesToRedis() {
...
const _dataArr = await getMasterCategories(); //from MongoDb
const repository = MasterCategoryRepo.getRepository();
if (repository && _dataArr && _dataArr.length) {
for (const record of _dataArr) {
const entity = repository.createEntity(record);
entity.categoryTag = [entity.category]; //for tag search
//adds JSON to Redis
await repository.save(entity);
}
}
...
}
async function getMasterCategories() {
//fetching data from MongoDb
...
db.collection("masterCategories").find({
statusCode: {
$gt: 0,
},
category: {
$in: ["COUNTRY", "LANGUAGE"],
},
});
...
}
您还可以查看 RedisInsight 以验证 JSON 数据是否已插入,如下所示:
RedisInsight 是一个免费的 Redis GUI,用于查看 Redis 中的数据。 点击此处下载。
在使用 Redis 进行预取之前,应用程序会搜索静态数据库(MongoDB)以检索电影的国家和语言值。随着越来越多的人开始使用该应用程序,数据库被查询淹没。应用程序变得缓慢且无响应。为了解决这个问题,应用程序被修改为使用 Redis 来存储主数据。下面的代码片段展示了应用程序如何查询 Redis 以获取主数据,特别是下拉菜单的国家和语言值。
*** With Redis ***
*** Redis OM Node query ***
function getMasterCategories() {
...
masterCategoriesRepository
.search()
.where("statusCode")
.gt(0)
.and("categoryTag")
.containOneOf("COUNTRY", "LANGUAGE");
...
}
在本教程中,您学习了如何使用 Redis 进行缓存预取,并以 "主数据查找" 为例。虽然这只是 Redis 在应用程序中的一种使用方式,但您可以根据需要逐步采用 Redis,并结合其他缓存策略/模式。有关缓存主题的更多资源,请查看以下链接。