查询缓存控制

生产环境下通常依赖缓存来提高性能。

一个 GraphQL 查询会调用多个 Resolver 函数,每个 Resolver 函数都能够具有不同的缓存定义。有的可能缓存几秒钟,有的可能缓存几个小时,有的可能所有用户都相同,有的可能每个会话都不同。

Async-graphql提供一种机制允许定义结果的缓存时间和作用域。

你可以在对象上定义缓存参数,也可以在字段上定义,下面的例子展示了缓存控制参数的两种用法。

你可以用max_age参数来控制缓存时长(单位是秒),也可以用publicprivate来控制缓存的作用域,当你不指定时,作用域默认是public

Async-graphql查询时会合并所有缓存控制指令的结果,max_age取最小值。如果任何对象或者字段的作用域为private,则其结果的作用域为private,否则为public

我们可以从查询结果QueryResponse中获取缓存控制合并结果,并且调用CacheControl::value来获取对应的 HTTP 头。

#![allow(unused)]
fn main() {
extern crate async_graphql;
use async_graphql::*;
struct Query;
#[Object(cache_control(max_age = 60))]
impl Query {
    #[graphql(cache_control(max_age = 30))]
    async fn value1(&self) -> i32 {
        1
    }

    #[graphql(cache_control(private))]
    async fn value2(&self) -> i32 {
        2
    }

    async fn value3(&self) -> i32 {
        3
    }
}
}

下面是不同的查询对应不同缓存控制结果:

# max_age=30
{ value1 }
# max_age=30, private
{ value1 value2 }
# max_age=60
{ value3 }