首页 > 解决方案 > 在 GraphQL 服务器设置中何时使用 Redis 以及何时使用 DataLoader

问题描述

我已经在 GraphQL 服务器上工作了一段时间,虽然我了解大部分方面,但我似乎无法掌握缓存。

在缓存方面,我看到提到的 DataLoader 和 Redis,但我不清楚何时应该使用什么以及如何使用它们。

我认为 DataLoader 更多地用于字段级别来解决 n+1 问题?我猜Redis的水平更高?

如果有人能对此有所了解,我将不胜感激。

谢谢你。

标签: cachingredisgraphqlapolloapollo-server

解决方案


DataLoader主要是一种对某些数据源的请求进行批处理的方法。但是,它确实可以选择在每个请求的基础上使用缓存。这意味着,在执行相同的 GraphQL 查询时,您只能获取一次特定实体。例如,我们可以同时调用load(1)load(2),这些将被批处理到一个请求中,以获取与这些 id 匹配的两个实体。load(1)如果稍后在执行相同的请求时另一个字段调用,那么该调用将简单地返回具有1我们之前获取的 ID 的实体,而不向我们的数据源发出另一个请求。

DataLoader 的缓存特定于单个请求。即使同时处理两个请求,它们也不会共享一个缓存。DataLoader 的缓存没有过期时间——而且它没有必要,因为一旦请求完成,缓存就会被删除。

Redis 是一个键值对存储,用于缓存、队列、PubSub 等。我们可以使用它来提供响应缓存,这将让我们有效地绕过一个或多个字段的解析器并使用缓存值代替(直到它过期或失效)。我们可以将其用作 GraphQL 与数据库、API 或其他数据源之间的缓存层——例如,这就是RESTDataSource所做的。在实现订阅时,我们可以将它用作PubSub 实现的一部分。

DataLoader 是一个小型库,用于解决特定问题,即向数据源生成过多请求。使用 DataLoader 的替代方法是在根级别获取您需要的所有内容(基于请求的字段),然后让默认解析器逻辑处理其余部分。Redis 是一种有多种用途的键值对存储。您是否需要一个或另一个,或两者都需要,取决于您的特定业务案例。


推荐阅读