GraphQL:Apollo 客户端缓存如何工作以保持数据与服务器的一致性?
GraphQL: how does Apollo client caching work to keep data consistency with the server?
我正在使用 apollo-client
和 apollo-cache-inmemory
。
假设我有 2 个页面:项目列表 页面和项目详细信息 页面。
项目列表 页面显示(通过使用 client.query(...)
:
获取数据
- 项目 A
- 项目 B
- 项目 C
当导航到项目 B 的 项目详细信息 页面时,我使用此处描述的涉及 store.readQuery
和 store.writeQuery
的突变技术对项目 B 进行突变:https://www.apollographql.com/docs/react/caching/cache-interaction/#updating-after-a-mutation
现在,在导航回 项目列表 页面之前,假设我的应用程序的另一个用户对项目 A 进行了更改。
我的问题:
当我导航回项目列表页面时,我是从缓存还是从服务器获取数据? client.query(...)
是否总是从服务器获取数据?
如果我从缓存中获取数据,我如何与服务器保持数据一致性? (目标是始终在列表中显示更新的项目,例如项目 A - 在优化缓存的同时与服务器同步)
如果您想要保持数据同步,即使其他用户更改了数据,您也需要始终从服务器获取数据或在服务器和客户端上实施订阅。这样您就可以在数据更改时推送新事件,并让客户端订阅这些更改以实时保持其缓存更新。
我正在使用 apollo-client
和 apollo-cache-inmemory
。
假设我有 2 个页面:项目列表 页面和项目详细信息 页面。
项目列表 页面显示(通过使用 client.query(...)
:
- 项目 A
- 项目 B
- 项目 C
当导航到项目 B 的 项目详细信息 页面时,我使用此处描述的涉及 store.readQuery
和 store.writeQuery
的突变技术对项目 B 进行突变:https://www.apollographql.com/docs/react/caching/cache-interaction/#updating-after-a-mutation
现在,在导航回 项目列表 页面之前,假设我的应用程序的另一个用户对项目 A 进行了更改。
我的问题:
当我导航回项目列表页面时,我是从缓存还是从服务器获取数据?
client.query(...)
是否总是从服务器获取数据?如果我从缓存中获取数据,我如何与服务器保持数据一致性? (目标是始终在列表中显示更新的项目,例如项目 A - 在优化缓存的同时与服务器同步)
如果您想要保持数据同步,即使其他用户更改了数据,您也需要始终从服务器获取数据或在服务器和客户端上实施订阅。这样您就可以在数据更改时推送新事件,并让客户端订阅这些更改以实时保持其缓存更新。