在 GraphQL 中如何使用请求级别的缓存

阅读时长 8 分钟读完

随着 GraphQL 在前端开发中的越来越普及,对于性能优化的需求也变得越来越重要。而请求级别的缓存是 GraphQL 中一种非常有效的性能优化方式。在本文中,我们将会详细介绍如何在 GraphQL 中使用请求级别的缓存,并提供一些示例代码来帮助读者更好地理解这个过程。

请求级别缓存的工作方式

在传统的 RESTful API 中,通常使用 HTTP 缓存和浏览器缓存来实现缓存的功能。但是在 GraphQL 中,则需要使用请求级别的缓存来保证每个请求的缓存结果不一样。

请求级别缓存的工作方式基于 GraphQL 查询的结构。因为 GraphQL 查询可以明确指定数据的结构,所以请求级别缓存可以根据查询结构来存储和检索缓存结果。

请求级别缓存通常是通过将查询字符串作为缓存的键来实现的。当一个新的查询到达时,缓存系统首先检查该查询的字符串是否已经存在于缓存中,如果是,则直接返回缓存结果,否则就会执行正常的查询操作,并将结果存入缓存中。

如何在 GraphQL 中使用请求级别的缓存

在 GraphQL 中,使用请求级别的缓存通常需要依赖一些开源库和中间件,其中最常用的是 apollo-cache-control 和 apollo-server-express。

使用 apollo-cache-control

apollo-cache-control 是一个由 Apollo 团队提供的 GraphQL 库,它可以集成缓存控制到你的 GraphQL API 中。通过添加缓存控制指令(例如 max-age 或 stale-while-revalidate)到 GraphQL 的响应头中,可以控制客户端缓存的时间以及在缓存失效时该如何处理。

要使用 apollo-cache-control,首先需要将该库添加到应用程序中。可以使用以下命令将其安装到你的项目中:

安装完毕后,在应用程序中注册该库。例如,如果你正在使用 Apollo Server 来构建 GraphQL 服务器,则可以像这样使用:

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

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

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

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

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

在应用程序中设置 apollo-cache-control 后,就可以在 GraphQL API 中使用缓存控制指令了。例如,下面的示例告诉客户端在 60 秒内缓存查询结果:

使用 apollo-server-express

apollo-server-express 是一个广泛使用的 GraphQL 中间件库,它提供了请求级别缓存的支持。通过使用 graphql-cache 中间件,可以实现 GraphQL API 的响应缓存。

要使用 apollo-server-express,首先需要将该库添加到应用程序中。可以使用以下命令将其安装到你的项目中:

安装完毕后,在应用程序中注册该库。例如,如果你正在使用 Express 来构建 GraphQL 服务器,则可以像这样使用:

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

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

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

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

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

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

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

在应用程序中设置 graphql-cache 后,就可以在 GraphQL API 中使用缓存了。例如,下面的示例告诉客户端在 60 秒内缓存查询结果:

示例代码

以下示例代码展示了如何在 GraphQL 中使用请求级别的缓存。这个例子使用了 apollo-server-express。

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

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

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

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

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

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

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

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

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

在这个例子中,我们创建了一个简单的游戏查询 API。我们使用了 graphql-cache 中间件,并在 games 查询上设置了缓存控制指令来指示客户端缓存查询结果。

在这个查询中,我们设置了 max-age 指令为 60 秒,这意味着客户端将会在 60 秒内缓存查询结果。在第二次查询时,缓存结果将会直接返回而不是重新执行查询操作。

总结

通过本文,读者可以学习到请求级别缓存在 GraphQL 中的工作方式以及如何在 GraphQL 中使用请求级别的缓存。请求级别缓存可以大大提高 GraphQL API 的响应速度,通过减少冗余查询和减少对服务端的请求,实现客户端的性能优化。如果你正在构建 GraphQL API 或维护已有的 GraphQL API,那么学习请求级别缓存将是一个很有价值的技能。

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

纠错
反馈