如何在 GraphQL 中将查询结果缓存到 Redis 中

面试官:小伙子,你的数组去重方式惊艳到我了

什么是 GraphQL?

GraphQL 是一个用于 API 开发的查询语言和运行时。它提供了一个强类型的方式来描述 API,并且允许客户端精确地指定它需要从服务器获得哪些数据。与 REST API 不同,GraphQL API 允许客户端精确指定其需要的数据集,这可以提高性能并减少带宽占用。

什么是 Redis?

Redis 是一个开源的,内存数据结构存储系统,可以用作数据库、缓存和消息队列代理。Redis 提供了快速、可伸缩、高效的方式来处理数据,并且支持多种数据类型,包括字符串、哈希表、列表、集合和有序集合。Redis 使用内存中的数据来提供高性能访问,这使得它具有极高的吞吐量和低延迟。

GraphQL 结果缓存中的挑战

处理查询请求时,GraphQL 会执行相应的查询处理流程并返回结果。当客户端进行重复请求时,如果我们可以从缓存中获取结果,就可以避免执行昂贵的处理流程,从而提高性能和降低成本。但是,GraphQL 结果缓存中存在几个挑战:

  • 结果缓存的键需要包括查询、查询变量和授权信息,以保证结果的正确性和私密性。
  • GraphQL 查询和结果可以包含任意层级和类型的嵌套结构,这使得缓存结果变得困难。
  • GraphQL 允许客户端获取包含多个资源的嵌套数据,这意味着缓存结果需要能够处理多表查询,从而再次增加了缓存的难度。

将查询结果缓存到 Redis 中的解决方案

为了解决上述挑战,我们可以使用一些技术来缓存 GraphQL 查询结果到 Redis 中:

将查询参数哈希

为了避免在 Redis 中存储大量的键,我们可以将 GraphQL 查询和其变量参数生成一个哈希值。这个哈希值将作为 Redis 中存储缓存结果的键。为了确保查询结果的正确性和私密性,我们还需要将查询的授权信息包含在哈希值中。

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

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

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

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

缓存结果到 Redis

一旦我们生成了 Redis 缓存的键,我们就可以将查询结果存储到 Redis 中。我们可以使用 Redis 的 set 命令将结果存储为 JSON 格式的字符串。同时,我们还可以设置过期时间来确保缓存不会无限增加。

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

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

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

检查 Redis 缓存

当我们检查 Redis 缓存时,我们首先需要从 GraphQL 查询和其变量参数中生成缓存键。然后,我们可以使用 Redis 的 get 命令获取缓存结果。如果查询结果不为空,则可以直接将结果返回给客户端,避免执行昂贵的处理流程。

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

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

将 Redis 缓存集成到 GraphQL 解析器中

最后,我们可以将 Redis 缓存集成到 GraphQL 解析器中,以便在执行查询时进行缓存和检查。我们可以在解析器的 resolve 函数中添加缓存逻辑,并使用 context 参数中的 Redis 连接来进行操作。

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

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

通过将这些代码添加到 GraphQL 解析器中,我们可以轻松地启用 Redis 缓存,以提高 GraphQL 查询的性能和可扩展性。

示例代码

为了更好地说明 Redis 缓存的使用,下面是一个完整的示例代码,它演示了如何将 GraphQL 查询结果缓存到 Redis 中。

第一步是创建 GraphQL 解析器和 Redis 连接:

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

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

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

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

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

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

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

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

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

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

然后,我们需要创建一个 GraphQL schema,并将解析器与其相关联:

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

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

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

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

最后,我们需要使用服务器框架(如 Express 或 Koa)来将 GraphQL API 暴露出去:

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

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

结论

使用 Redis 缓存 GraphQL 查询结果可以大大提高性能和可扩展性。由于 GraphQL 查询可以包含任意层级和类型的嵌套结构,所以在实现缓存时要考虑到这点。使用哈希算法来生成缓存键,并在键中包含授权信息可以保证缓存结果的正确性和私密性。最后,我们可以将缓存逻辑添加到 GraphQL 解析器中,并使用 Redis 连接来执行实际的缓存操作。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66f0bddb6fbf96019733da89


猜你喜欢

  • 参与 ECMAScript 的标准化进程

    ECMAScript 是一种广泛使用的编程语言,通常被称为 JavaScript。它是 Web 开发领域的基础,被用于创建交互式的网页和应用程序。ECMAScript 规范被制定为 ECMA-262 ...

    24 天前
  • ES8 中的变量解构及其应用场景

    ES8(也称为 ECMAScript 2017)是 JavaScript 的最新版本之一。它引入了很多新的语言特性,其中一个是变量解构。在本篇文章中,我们将探讨 ES8 中的变量解构及其应用场景。

    24 天前
  • Enzyme 测试 React 组件更新的各种方式

    简介 前端开发中,测试是必不可少的一环,因为良好的测试可以确保代码的质量和可维护性。在 React 中,我们经常使用 Enzyme 进行组件测试。这篇文章主要介绍如何使用 Enzyme 测试 Reac...

    24 天前
  • RxJS 优化实践:concat 操作符与数组拼接效率分析

    随着前端应用业务逻辑的复杂化以及数据量的增加,异步编程已经成为前端领域中必备的技能。RxJS 作为一种流式编程库,已经广泛应用于前端开发中。 在 RxJS 中,concat 操作符被用来将多个流连接起...

    24 天前
  • 使用 Mongoose 进行数据备份和恢复

    在开发 Web 应用程序时,数据恢复和备份是非常重要的。特别是在大规模的应用程序中,数据可能会在许多部分之间传输,可能在其中一部分中出现故障。此时,数据备份和恢复就起到了至关重要的作用。

    24 天前
  • 解决 Express.js 的 XSS 攻击问题

    XSS攻击是最常见的web安全问题之一,攻击者通过在页面中注入恶意脚本,偷取用户信息或有意或无意的破坏web页面的稳定性。在JavaScript应用程序中,XSS攻击尤为常见,因此在Express.j...

    24 天前
  • EC2 实例上的性能优化技巧

    在使用 AWS EC2 实例运行前端项目时,为了提高项目性能和减少成本,我们需要对 EC2 实例进行优化。本文将会介绍一些常用的 EC2 实例性能优化技巧,帮助前端开发人员在云平台上更好地运行网站。

    24 天前
  • CSS Grid 如何搭配 CSS 动画实现复杂效果

    前言 随着Web前端技术的不断发展,越来越多的网页设计师和前端工程师开始使用CSS Grid作为页面布局的首选工具。CSS Grid作为一种全新的CSS布局模块,可以以简单的方式创造出复杂的布局效果。

    24 天前
  • 如何在 Serverless 应用中进行大数据处理?

    Serverless 应用是近年来快速发展的一种应用程序模型,它基于事件驱动和无服务器架构,使开发者可以在不关注底层基础设施的情况下,轻松开发和部署应用程序。 但是,对于一些需要大数据处理的应用程序,...

    24 天前
  • 使用 Node.js 和 React 实现简单的全栈应用

    随着 Web 应用程序对用户需求的不断增加,前端技术越来越重要,而全栈开发也成为了一种非常流行的趋势。这篇文章将讲解如何使用 Node.js 和 React 实现一个简单的全栈应用,并分享给大家一些实...

    24 天前
  • Promise 深入解析:实现 Ajax 请求场景分析

    前言 在前端的开发中,我们经常需要使用到 Ajax 进行异步数据请求。而 Promise 作为一种解决异步编程的方案,可以更加方便、优雅地进行对异步操作的处理。本文将深入解析 Promise,在实现 ...

    24 天前
  • RESTful API 中处理图片的方法

    随着现代互联网的发展,越来越多的网站和应用程序依赖于 RESTful API 来进行数据传输和处理。在大多数场景中,图片都是 API 中不可避免的一部分。在本文中,我们将探讨如何在 RESTful A...

    24 天前
  • ES11 中的数字分隔符:提高数字可读性

    在 ES11 中,新增了一项非常实用的功能:数字分隔符。通过在数字中添加下划线(_),可以让数字更加易读、易于理解。 为什么需要数字分隔符 在传统的编写数字的方式中,较大的数字可能会变得不够清晰。

    24 天前
  • History API 在 Node.js 中不可用 - 使用 Babel 配置解决之道

    前端开发者的一个常见问题是如何在 Node.js 中使用 History API。然而,在 Node.js 环境中,这个 API 是不可用的。这篇文章将探讨为什么它不可用,以及我们可以如何使用 Bab...

    24 天前
  • Deno 安全模式的优点和限制

    前言 Deno 是一个用于开发服务器端和命令行应用程序的新型 JavaScript/TypeScript 运行时环境。Deno 的设计目标是安全,同时提供良好的开发体验和性能。

    24 天前
  • 使用 TypeScript 开发 Redux 应用

    介绍 Redux 是一个流行的 JavaScript 应用程序状态管理库。它被广泛用于 React 应用程序中,但它也可以用于任何 JavaScript 应用程序中。

    24 天前
  • 如何规避 ECMAScript 2021 赋初值坑

    如何规避 ECMAScript 2021 赋初值坑? 在 ECMAScript 2021 中,新增了对赋初值语法的支持,该语法允许我们在函数内部为函数参数指定默认值,从而让代码更加清晰和简化。

    24 天前
  • 如何在 ESLint 中禁用某些检查规则

    如何在 ESLint 中禁用某些检查规则 ESLint 是一个非常强大的 JavaScript 代码质量工具,可以用来帮助开发者发现代码中存在错误、不一致的风格、潜在的危险等等问题。

    24 天前
  • Fastify 框架中的响应缓存

    在 Web 应用程序中,缓存是提高性能的一种常见方法。缓存可以减少服务器的负载和减少响应时间,从而改善应用程序的用户体验。Fastify 框架提供了一种简单而有效的方法来实现响应缓存。

    24 天前
  • 异步 I/O 模型在 MongoDB 中的应用

    在 Web 开发领域中,异步 I/O 模型是提高性能的一种重要技术。与传统的同步 I/O 模型相比,异步 I/O 不会在等待 I/O 操作完成时阻塞应用程序的执行,而是通过回调或事件通知的方式处理 I...

    24 天前

相关推荐

    暂无文章