学习

如何使用 Redis 进行缓存预取策略

Will Johnston
作者
Will Johnston, Redis 开发者增长经理
Prasan Kumar
作者
Prasan Kumar, Redis 技术解决方案开发人员
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

什么是缓存预取?#

缓存预取是在数据库管理系统 (DBMS) 中使用的一种技术,通过在查询明确请求数据之前预测和获取存储子系统中的数据来提高查询性能。

缓存预取主要有三种策略

  1. 1.顺序预取:这种方法预测数据将以顺序方式访问,例如扫描表或索引时。它预取序列中的下一组数据块或页面,以确保在需要时它们可在缓存中使用。
  2. 2.基于查询模式的预取:一些数据库系统可以分析过去的查询模式来预测将来可能访问哪些数据。通过分析这些模式,DBMS 可以预取相关数据并在执行类似查询时使数据在缓存中可用。
  3. 3.基于数据访问模式的预取:在某些情况下,数据访问模式可以从应用程序逻辑或模式设计中得出。通过了解这些模式,数据库系统可以预取可能很快访问的数据。

本教程将涵盖第三种策略,即 基于数据访问模式的预取

假设您正在构建一个电影流媒体平台。您需要能够为用户提供一个仪表板,使他们能够快速找到要观看的电影。您有一个包含大量电影的数据库,并且您按产地、类型、语言等对它们进行分类。此数据变化频率很低,并且在您的应用程序和其他数据中经常被引用。这种存活时间长且变化频率低的类型数据被称为“主数据”。

开发人员面临的一个持续挑战是快速创建、读取、更新和删除主数据。您可能将主数据存储在诸如 SQL 数据库或文档数据库之类的系统记录中,然后使用 Redis 作为缓存来加速对该数据的查找。然后,当应用程序请求主数据时,主数据不是来自系统记录,而是来自 Redis。这被称为“主数据查找”模式。

从开发人员的角度来看,“主数据查找”是指在业务事务中、在应用程序设置中以及软件以任何其他方式检索信息时访问主数据的过程。主数据查找的示例包括为用户界面 (UI) 元素(例如下拉对话框、选择值、多语言标签)获取数据,获取常量,获取用户访问控制,获取主题以及其他产品配置。

下面是使用 Redis 和 MongoDB 作为系统记录的预取主数据的数据流图。

获取数据的步骤如下

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

为什么您应该使用 Redis 进行缓存预取#

  1. 1.高速提供预取数据:根据定义,几乎每个应用程序都需要访问主数据或其他常用数据。使用 Redis 预缓存此类频繁使用的数据,可以高速向用户提供数据。
  2. 2.支持大型表格:主表通常包含数百万条记录。搜索它们会导致性能瓶颈。使用 Redis 对大型表格执行实时搜索,以亚毫秒级响应速度提高性能。
  3. 3.推迟昂贵的硬件和软件投资:通过使用 Redis,您可以推迟昂贵的基础设施增强。无需向 CFO 索要支票,即可获得性能和可扩展性优势。
提示

如果您使用 Redis Cloud,由于其对 JSON 和搜索的支持,缓存预取变得更加容易。您还可以获得其他功能,例如实时性能、高可扩展性、弹性和容错能力。您还可以使用高可用性功能,例如主动-主动地理冗余。

带有 Redis 和 MongoDB 的 NodeJS 应用程序中的缓存预取#

演示应用程序#

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

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

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 存储并提供这些值。

使用 Redis 和 MongoDB 预取数据#

下面的代码片段用于预取 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 查询预取数据#

在使用 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 在应用程序中的一种使用方式,但您可以根据需要逐步采用 Redis,并结合其他缓存策略/模式。有关缓存主题的更多资源,请查看以下链接。

其他资源#