解决 GraphQL 中的查询缓存问题

背景

随着前端技术的不断发展,越来越多的应用程序开始采用 GraphQL 作为其数据查询语言。GraphQL 具有强大的查询能力和可扩展性,使其成为构建现代应用程序的理想选择。然而,与任何技术一样,GraphQL 也有一些缺点,其中一个问题就是查询缓存。当多次执行相同的查询时,GraphQL 无法自动缓存结果,这会导致频繁的网络请求和服务器开销。在这篇文章中,我们将探讨如何解决 GraphQL 中的查询缓存问题。

客户端缓存

GraphQL 中的查询缓存问题可以通过在客户端上实现缓存来解决。客户端缓存是指将查询结果存储在客户端浏览器或应用程序中,以便在将来的查询中重复使用。这样一来,当用户执行相同的查询时,客户端可以从缓存中获取数据而不是通过网络请求重新获取数据。这可以大大减少网络请求和服务器开销。

在 GraphQL 中,查询结果是一个具有类似树形结构的 JSON 对象。因此,缓存查询结果的最简单方法是将结果直接存储在客户端的缓存中,并使用查询的哈希作为键。每次执行查询时,客户端可以使用相同的哈希和参数从缓存中读取结果。

以下是一个示例代码:

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

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

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

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

fetchPolicy 参数指示 Apollo Client 先从缓存中获取结果,如果缓存中不存在,则执行网络请求。这种模式在查询结果很少更改的情况下非常有效。但是,当数据更改时,必须强制刷新缓存以获取最新数据。

服务器端缓存

如果多个客户端共享相同的查询,那么客户端缓存可能不太有效。在这种情况下,服务器端缓存将非常有用。服务器端缓存是指将查询结果存储在服务器上,以便所有客户端都可以从中受益。这可以大大减少服务器开销,并提高应用程序的性能。

许多 GraphQL 服务器都具有内置的查询结果缓存。例如,Apollo Server 具有默认的 InMemoryCache 缓存,可以在服务器中缓存查询结果。当多个客户端执行相同的查询时,服务器可以从缓存中读取结果,而不必重新执行查询。

以下是一个使用 Apollo Server 缓存的示例代码:

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

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

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

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

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

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

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

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

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

此示例代码创建了一个带有默认 InMemoryCache 缓存的 Apollo Server。当客户端执行相同的查询时,服务器可以从缓存中读取结果,并避免重复执行查询。

结论

在 GraphQL 应用程序中,查询缓存是提高性能的关键。无论是在客户端还是服务器端执行缓存,都可以大大减少网络请求和服务器开销,并提高应用程序的性能。我们提供了一些示例代码,希望有所帮助。如果你正在使用 GraphQL 并遇到性能问题,请尝试使用缓存来解决问题。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672ec8c3eedcc8a97c8acb11