目前我有 graphql 和 mongodb,现在我想添加 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 的底层协议(protocol)非常高效,您可以这样做(给定图书 ID 'book1234'):
HGETALL book1234
获取所有内容HGET book1234 A B C X Y Z L M N
(或您选择的字段)。 HGET 是可变参数的(从 Redis 4 开始),因此您可以只提供所需的字段。
最后,如果您有能力安装 Redis 模块,您可能需要查看 ReJSON ,它允许对 JSON 数据进行 native 处理 - 允许您从结构中挑选数据。这可能是两全其美的。
关于mongodb - 如何使用 Redis 优化 Graphql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47739064/