用 Redis 响应快速的 GraphQL 查询

阅读时长 10 分钟读完

GraphQL 是一种用于 API 的查询语言,可以让前端开发人员灵活地请求数据并减少不必要的网络请求。然而,在大型应用程序中,GraphQL 查询可以变得相当复杂和缓慢,尤其是在处理大量数据时。这就是我们需要 Redis 的原因。

Redis 简介

Redis 是一款开源的内存数据存储系统,广泛用于缓存、消息队列和数据存储等领域。Redis 的出色性能和灵活性使其成为处理快速查询的理想选择,特别是在 GraphQL API 中。

Redis 与 GraphQL 结合使用的好处

在 GraphQL 中,每个查询都需要从数据库中获取数据。当查询变得复杂时,必须在多个表中进行关联查询,这可能导致许多 JOIN 操作和非常慢的响应时间。这是 Redis 显得非常有用的地方:使用 Redis 可以将查询结果缓存起来以避免重复查询。

具体来说,在每次查询完成后,将查询结果存储在 Redis 中。然后,在下次请求相同的数据时,只需要从 Redis 中获取缓存的结果,而不是再次进行数据库查询。这可以极大地改善性能,减少响应时间。

在 Node.js 中使用 Redis

下面是一个演示 Redis 在 Node.js 中如何使用的示例:

-- -------------------- ---- -------
----- ----- - -----------------
----- ------ - ---------------------

-- ------
-------- ---------------- -
  ------ --- --------------- -- -
    -- -------
    ----------------- ----- ------- -- -
      -- -------------
      -- ------- --- ----- -
        -------------- ----- --------- -------
        ----------------------------
      -
      -- -------------------
      ---- -
        -------------------------- -------
        ----- ------ - ----------------------------
        ----------------- ------------------------
        ----------------
      -
    ---
  ---
-

在上面的代码中,我们使用 Redis 的 get 和 set 方法从 Redis 缓存中获取和存储查询结果。如果结果存在,则返回缓存的结果,否则进行数据库查询,在将查询结果存储到 Redis 缓存中。

如何将 Redis 与 GraphQL 结合使用

接下来,我们将完成一个示例项目,演示 Redis 和 GraphQL 结合使用的过程。

步骤 1:安装依赖项

我们将使用以下依赖项:

  • graphql: GraphQL 核心库。
  • express: 基于 Node.js 的 Web 开发框架。
  • express-graphql: 一个可用于集成 GraphQL 的中间件。
  • redis: Redis 客户端库。

通过以下命令安装这些依赖项:

步骤 2:准备数据

为了演示 GraphQL 和 Redis 结合使用的过程,我们将创建一个用于存储书籍和作者信息的简单数据库。我们首先创建以下文件:

-- -------------------- ---- -------
-- ---------
-
  ---- -
    -------- ----------- --------
    ----------- ---
  --
  ---- -
    -------- ----- ---------
    ----------- ---
  --
  ---- -
    -------- ---- -----------
    ----------- ---
  -
-

-- -----------
-
  ---- -
    ------- --------- -- ------
  --
  ---- -
    ------- ----
  --
  ---- -
    ------- ------
  -
-

步骤 3:创建 GraphQL Schema

接下来,我们将创建 GraphQL Schema,定义我们可以查询的书籍和作者信息。将以下代码保存到 schema.js 文件中:

-- -------------------- ---- -------
----- -
  ------------------
  --------------
  ----------
  --------------
  -----------
- - -------------------

----- -------- - --- -------------------
  ----- -------
  ------- -
    --- - ----- --------- --
    ------ - ----- ------------- --
    ------- -
      ----- -----------
      --------------- ----- -
        -- - ----- ------
        ------ -------------------- - -----------------
      -
    -
  -
---

----- ---------- - --- -------------------
  ----- ---------
  ------- -
    --- - ----- --------- --
    ----- - ----- ------------- --
    ------ -
      ----- ----------------------
      --------------- ----- -
        -- - ----- ------
        ------ ---------------------------------
          ------------ -- ------------- --- ----------
          --------- -- -------------------------------
      -
    -
  -
---

----- --------- - --- -------------------
  ----- ----------------
  ------- -
    ----- -
      ----- ---------
      ----- - --- - ----- --------- - --
      --------------- ----- -
        -- - ----- ------
        ------ ------------------------------
      -
    --
    ------- -
      ----- -----------
      ----- - --- - ----- --------- - --
      --------------- ----- -
        -- - ----- ------
        ------ --------------------------------
      -
    --
    ------ -
      ----- ----------------------
      --------------- ----- -
        -- - ----- ------
        ------ ------------------------------------------ --
          -----------------------------
        --
      -
    --
    -------- -
      ----- ------------------------
      --------------- ----- -
        -- - ----- ------
        ------ ---------------------------------------------- --
          ---------------------------------
        --
      -
    -
  -
---

-------------- - --- ---------------
  ------ ---------
---

在上面的代码中,我们定义了两个类型:BookAuthor。这两种类型都可以在 GraphQL 中查询,并且它们也可以相互关联。我们还定义了一个根查询对象 RootQuery,它包含了可以查询的所有字段。

步骤 4:创建 Express 应用程序

我们将使用 Express 应用程序来公开我们的 GraphQL Schema。将以下代码保存到 server.js 文件中:

-- -------------------- ---- -------
----- ------- - -------------------
----- ----------- - ---------------------------
----- ------ - --------------------
----- ----- - -----------------
----- ------ - ---------------------

-- ------
-------- ---------------- -
  ------ --- --------------- -- -
    -- -------
    ----------------- ----- ------- -- -
      -- -------------
      -- ------- --- ----- -
        -------------- ----- --------- -------
        ----------------------------
      -
      -- -------------------
      ---- -
        -------------------------- -------
        ----- ------ - ----------------------------
        ----------------- ------------------------
        ----------------
      -
    ---
  ---
-

----- --- - ----------

--------
  -----------
  -------------
    -------
    --------- ----
  --
--

---------------- -- -- -
  ------------------- -------
---

在上面的代码中,我们首先创建一个 Redis 客户端。然后,我们编写了一个 getResult 函数,该函数从 Redis 缓存中获取查询结果。如果结果不存在,则进行数据库查询并将结果存储在 Redis 缓存中。

最后,我们使用 Express 应用程序公开 GraphQL Schema,将查询请求发送到 Redis。

步骤 5:测试应用程序

完成上述步骤后,我们可以启动 Node.js 应用程序并测试它的工作方式。在 terminal 中运行以下命令:

然后,在浏览器中打开 http://localhost:4000/graphql,你将看到一个 GraphQL Playground 介面。在这个介面中,你可以键入查询,例如:

此查询将检索所有书籍和相应作者的名称。此查询将查询 Redis 缓存,如果结果不存在,则将结果存储在 Redis 中。

结论

使用 Redis 可以大大加速 GraphQL 查询的响应时间,同时减少数据库查询的次数。在本文中,我们演示了如何在 Node.js 中使用 Redis 缓存 GraphQL 查询结果。Redis 和 GraphQL 结合使用的好处远不止如此,你也可以将这种技术应用于其他 Web 技术中。这是一个很好的要点,即使是拥有大量并复杂数据的项目,我们也可以通过使用 Redis 以更快,更可靠的方式来管理它们。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f8214cc5c563ced5be7843

纠错
反馈