Caching 为graphQL查询的部分指定缓存策略

Caching 为graphQL查询的部分指定缓存策略,caching,graphql,apollo,graphql-java,apollo-ios,Caching,Graphql,Apollo,Graphql Java,Apollo Ios,在Apollo的GraphQL版本中,有两个参数指定获取查询是应该从服务器获取数据还是使用本地缓存(如果有数据可用) 此外,缓存规范化允许使用缓存来减少需要从服务器获取的数据量。例如,若我正在请求对象A和对象B,但之前我已经请求了对象A和对象C,那个么在我当前的查询中,它将从缓存中获取A,从服务器中获取B 但是,它们为整个查询指定缓存策略。我想知道是否有一种方法可以在各个字段上指定TTL 从开发人员的角度来看,我希望能够在我的查询中指定我要去缓存一些我正在请求的信息,而不是其他信息。例如,以下面

在Apollo的GraphQL版本中,有两个参数指定获取查询是应该从服务器获取数据还是使用本地缓存(如果有数据可用)

此外,缓存规范化允许使用缓存来减少需要从服务器获取的数据量。例如,若我正在请求对象A和对象B,但之前我已经请求了对象A和对象C,那个么在我当前的查询中,它将从缓存中获取A,从服务器中获取B

但是,它们为整个查询指定缓存策略。我想知道是否有一种方法可以在各个字段上指定TTL

从开发人员的角度来看,我希望能够在我的查询中指定我要去缓存一些我正在请求的信息,而不是其他信息。例如,以下面的查询为例:

query PersonInfo($id: String) {
  person(id: $id) {
    birthcertificate  // Once this is cached, it is cached forever. I should just always get this info from the cache if it is available.
    age // I want to have this have a TTL of a day before invalidating the cached value and going to network
    legalName // I want to always go to network for this information. 
  }
}
换句话说,对于固定的
id
值(假设这是唯一一个涉及person对象或其字段的查询):

  • 第一次进行此查询时,我从服务器获取所有三个字段
  • 现在,如果我在几秒钟内再次进行此查询,我应该只从服务器获取第三个字段(
    legalName
    ),从缓存获取前两个字段
  • 现在,如果我等待超过一天,然后再次进行此查询,我将从缓存中获取
    出生证
    ,并从服务器获取
    年龄
    +
    法律名称
目前,为了按照我希望的方式完成这项工作,我最终编写了三个不同的查询,每个TTL一个。有更好的办法吗


更新:iOS客户端()上的缓存计时有了一些进展,但没有具体的进展?

这将是一个不错的功能,但是AFAIK[目前,采用js/react客户端,可能与iOS相同]:

  • 没有
    查询规范化
    ,只有
    缓存规范化

  • 如果缓存中不存在任何请求的字段,则从网络中获取整个查询

  • 缓存[normalized]项中没有存储时间(每个查询/每个类型)

目前[仅?]解决方案是[保存在本地状态/]存储每个/所有/某些查询/响应的时间戳(例如,在onCompleted中),并在获取之前使用它使它们失效/退出。它可能是一些现场政策fn内的自动f.e.启动计时器


您可以在登录后立即开始(会话)获取人员数据。。。以下任何更细粒度的
person(id:$id){birthcertificate}
query(如react子组件中的查询)都可以具有“自己的”'cache only'策略。如果您需要始终保持新鲜的
legalName
,请[单独或不单独]获取使用
仅限网络
策略。

您能否简要说明如何在获取前使用字段策略进行逐出?如果它可以用于读取本地存储,则它可以使用任何全局对象/函数来启动监视/重置计时器,用于在一段时间后逐出缓存项请参阅如何实现此目的的示例?