Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何使用Redis优化Graphql_Mongodb_Redis_Graphql - Fatal编程技术网

Mongodb 如何使用Redis优化Graphql

Mongodb 如何使用Redis优化Graphql,mongodb,redis,graphql,Mongodb,Redis,Graphql,目前我使用mongodb的graphql,现在我想添加redis层来优化服务器响应时间 假设我有这样的模式: type Query{ book(id: ID):Book } type Book{ # simple fields direct come from mongodb collection Book A B C # fields with values generated from simple fields X Y Z # fields wi

目前我使用mongodb的graphql,现在我想添加redis层来优化服务器响应时间

假设我有这样的模式:

type Query{
  book(id: ID):Book
}
type Book{
  # simple fields direct come from mongodb collection Book
  A
  B
  C

  # fields with values generated from simple fields
  X
  Y
  Z

  # fields with aggregated data from other db collections e.g avg/min/max
  L
  M
  N

}
问题是:我应该在Redis中存储什么样的数据

1) 数据库中的字符串化原始文档,由ID键入

2) 将每个计算字段放入redis的哈希值中,每个字段使用redis的HGET

以下是我对上述方案的担忧:

1) 字段ABC/XYZ应该可以,但LMN将导致额外的数据库访问


2) 当查询Book的所有字段时,每个字段都会有一个HGET,其中大多数只是简单的值,可能会在启动太多请求时浪费时间

通常,缓存的想法是以您希望的方式将数据取出。然而,Redis在内存中,内存并不便宜——所以我不会在序列化开销上浪费内存。也就是说,只需将这些值放入Redis散列(每个字段一个值)

至于在请求上浪费时间(我想你是指Redis),这不是一个大问题。Redis的底层协议非常高效,您可以(给定图书ID为'book1234'):

  • HGETALL book1234
    获取所有信息
  • HGET book1234 A B C X Y Z L M N
    (或您选择的字段)。HGET是可变的(因为Redis 4),所以您可以只提供所需的字段

最后,如果您有能力安装Redis模块,您可能想看看,它允许对JSON数据进行本机处理,允许您从结构中挑选数据。这可能是两全其美。

您是否在GraphQL解析器方法中使用批处理和缓存?如果不是的话,那就是你需要开始的地方——你可以使用Facebook的DataLoader库。下面是一个示例:请参见
src/Context.js
——数据加载器列表,可以在解析函数中使用,如:
ctx.bookById.load(123)