在 GraphQL 服务器设置中何时使用 Redis 以及何时使用 DataLoader

Rei*_*oot 1 caching redis apollo graphql apollo-server

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

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

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

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

谢谢你。

Dan*_*den 5

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

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

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

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