我已经在GraphQL服务器上工作了一段时间,尽管我了解大多数方面,但似乎无法掌握缓存。
在缓存方面,我看到了同时提到的DataLoader和Redis,但是我不清楚何时应该使用什么以及应该如何使用它们。
我认为在字段级别上更多地使用DataLoader来解决n + 1问题?我猜Redis会更高吗?
如果有人可以阐明这一点,我将不胜感激。
谢谢。
答案 0 :(得分:1)
DataLoader主要是 一种将请求批处理到某些数据源的方法。但是,它确实会根据每个请求利用缓存。这意味着,在执行相同的GraphQL查询时,您只能提取一次特定实体。例如,我们可以同时调用load(1)
和load(2)
,它们将被分批处理到单个请求中,以获取两个与这些ID匹配的实体。如果稍后另一个字段在执行同一请求 时调用load(1)
,则该调用将简单地返回我们先前获取的ID为1
的实体,而无需对数据源再次请求
DataLoader的缓存特定于单个请求。即使同时处理两个请求,它们也不会共享缓存。 DataLoader的缓存没有过期时间,也没有使各个缓存值无效的机制-不需要,因为一旦请求完成,缓存将被删除。
Redis是一个键值存储,用于缓存,队列,PubSub等。我们可以使用它来提供response caching,这将使我们有效地绕过一个或多个字段的解析器,而改用缓存的值(直到它过期或无效)。我们可以将其用作GraphQL与数据库,API或其他数据源之间的缓存层-例如,RESTDataSource就是这样做的。在实现订阅时,我们可以将其用作a PubSub implementation的一部分。
DataLoader是一个小型库,用于解决特定问题,即对数据源生成太多请求。使用DataLoader的另一种方法是在根级别(根据请求的字段)获取所需的所有 ,然后让默认的解析器逻辑处理其余部分。 Redis是具有多种用途的键值存储。是否需要一个或另一个,还是两者都取决于您的特定业务案例。