Apollo Client v3 在给定时间段后删除缓存条目

Posted

技术标签:

【中文标题】Apollo Client v3 在给定时间段后删除缓存条目【英文标题】:Apollo Client v3 Delete cache entries after given time period 【发布时间】:2020-10-11 10:39:00 【问题描述】:

我想知道是否有办法在某个时间段(例如 24 小时)后使缓存项过期。

我知道 Apollo Client v3 提供了 cache.evictcache.gc 等方法,这是一个好的开始,我已经在使用;但是,我想要一种在给定时间段后删除缓存项的方法。

我现在正在做的是为我的 Apollo 架构中的每个对象添加一个 TimeToLive 字段,当后端返回一个对象时,该字段将填充当前时间 + 24 小时(即 24 小时时间)。然后当我在前端查询数据时,我检查返回数据的 TimeToLive 字段是否在未来(如果不是,则意味着数据肯定是从缓存中检索的,在这种情况下,我调用 @987654324 @函数,它强制查询从服务器获取数据。但是,这似乎不是最好的方法,主要是因为我必须遍历返回的数据中的每个结果并检查是否有任何返回对象已过期;如果是,则重新获取所有内容。

我想到的另一个解决方案是使用React Native Queue 之类的东西,并有一个后台任务定期检查缓存并删除已过期的项目。但同样,我并不完全认同这个解决方案。

这里有一点上下文:我正在构建一个烹饪/食谱应用程序 - 并且食谱/帖子缓存在设备上;但是,我担心的是用户可以删除帖子,但是缓存该帖子的其他人仍然可以看到它,因此通过使缓存的项目过期,他们至少只能看到几个小时在它被移除之前。但是,它们可能是一起完成这一切的更好方法,即让服务器与缓存项目联系客户端(尽管在撰写本文时我想不出任何低升程解决方案)

【问题讨论】:

也找不到满足这种常见需求的简单解决方案 【参考方案1】:

apollo-invalidation-policies 将 Apollo 客户端 InMemoryCache 替换为 InvalidationPolicyCache 并且在 typePolicies 中您可以指定 timeToLive 字段。如果对象的访问时间超出其 TTL,则会将其逐出且不返回任何数据。

【讨论】:

以上是关于Apollo Client v3 在给定时间段后删除缓存条目的主要内容,如果未能解决你的问题,请参考以下文章

更新 apollo 缓存而不调用 graphql 服务器(apollo v3.3)

如何在 useSubscription 挂钩中更新订阅变量 - Apollo v3

Apollo 客户端 v3“替换 Y 对象的字段 X 时可能会丢失缓存数据”

@apollo/client 、 apollo-client 和 apollo boost 之间的区别

使用 apollo-client + firebase auth 刷新令牌

apollo 的 useQuery 数据在 client.resetStore() 之后没有更新