caching - 在 GraphQL 服务器设置中何时使用 Redis 以及何时使用 DataLoader
问题描述
我已经在 GraphQL 服务器上工作了一段时间,虽然我了解大部分方面,但我似乎无法掌握缓存。
在缓存方面,我看到提到的 DataLoader 和 Redis,但我不清楚何时应该使用什么以及如何使用它们。
我认为 DataLoader 更多地用于字段级别来解决 n+1 问题?我猜Redis的水平更高?
如果有人能对此有所了解,我将不胜感激。
谢谢你。
解决方案
DataLoader主要是一种对某些数据源的请求进行批处理的方法。但是,它确实可以选择在每个请求的基础上使用缓存。这意味着,在执行相同的 GraphQL 查询时,您只能获取一次特定实体。例如,我们可以同时调用load(1)
和load(2)
,这些将被批处理到一个请求中,以获取与这些 id 匹配的两个实体。load(1)
如果稍后在执行相同的请求时另一个字段调用,那么该调用将简单地返回具有1
我们之前获取的 ID 的实体,而不向我们的数据源发出另一个请求。
DataLoader 的缓存特定于单个请求。即使同时处理两个请求,它们也不会共享一个缓存。DataLoader 的缓存没有过期时间——而且它没有必要,因为一旦请求完成,缓存就会被删除。
Redis 是一个键值对存储,用于缓存、队列、PubSub 等。我们可以使用它来提供响应缓存,这将让我们有效地绕过一个或多个字段的解析器并使用缓存值代替(直到它过期或失效)。我们可以将其用作 GraphQL 与数据库、API 或其他数据源之间的缓存层——例如,这就是RESTDataSource所做的。在实现订阅时,我们可以将它用作PubSub 实现的一部分。
DataLoader 是一个小型库,用于解决特定问题,即向数据源生成过多请求。使用 DataLoader 的替代方法是在根级别获取您需要的所有内容(基于请求的字段),然后让默认解析器逻辑处理其余部分。Redis 是一种有多种用途的键值对存储。您是否需要一个或另一个,或两者都需要,取决于您的特定业务案例。
推荐阅读
- python - Python:将 pandas 数据透视表写入 excel 模板
- css - 如何在 CSS 中定位和更改来自(react.js)Formik 的类元素?
- javascript - 使用具有动态文本的相同角度模板
- c# - 登录表单,如何在一个登录表单中使用 3 个表登录?
- javascript - 使用 RxJS / TypeScript / JavaScript 将行转换为列
- twitter-bootstrap - Bootstrap - 导入引导 scss 时 col-size 不起作用
- google-apps-script - 为 Google 表格创建可安装触发器时出现意外错误
- python - 尝试将用户输入同时存储到数组和数据库中
- apache-spark - 可以使用 spark 配置配置 Beam 便携式跑步者吗?
- r - 如何在 R 中创建一个 for 循环来运行一个简单的随机样本并计算每个集合的平均值