繁体   English   中英

如何优化 Cloud Firestore 中的读写操作?

[英]How to optimize read-write operations in cloud Firestore?

我目前正在编写一个用于学习目的的 react + Firebase 项目,我想知道我应该采用哪种方法来有效地读取 firebase。

假设我有一个名为 product 的只读集合,其中包含大约 5000 个文档,因此当用户访问我的 React 应用程序时,每次访问将收取 5000 次读取费用。

资料来源: Cloud Firestore:读取是如何计算的?

由于如果用户垃圾邮件刷新以响应应用程序,这将很快消耗读取计数,是否有任何正确的方法从 firebase firestore 读取数据?

  1. 将产品信息存储在localstorage

    • 一旦 React 应用程序成功加载数据,继续将产品信息保存到本地存储中,以避免将来不必要的加载。
  2. 使用来自 firebase 的 SOURCE.CACHE

  3. 限制读取查询?

    • 限制每次加载的固定数量的文档返回,但在一天结束时我仍然必须加载完整的文档集,因此我对此持怀疑态度。

这是我目前能想到的,如果您的应用程序构建设计中有任何黄金标准或程序,请告诉我。

谢谢你。

您绝对应该引入分页策略。 另一种聪明的方法是根据上次突变时间进行查询。 如果配置了enablePersistence (否则将其设置为 false),Firestore 会自动将您的数据缓存在 web 中。

您可能会引入一种策略,仅在经过一段时间后使用 .network 进行查询。 但是,您需要在进行最后一次在线查询时跟踪每个模块。

function strategicFirestoreReadWrite(moduleKey, actionFn) {
  const lastFetchedDate = sessionStorage.getItem(moduleKey) || new Date();
  const difference = Math.abs(lastFetchedDate.getTime() - new Date().getTime())
  const hourDifference = difference  / 1000 / 3600
  const logToStorageFn = () => {
    sessionStorage.setItem(moduleKey, new Date())
  }

  // Performing operation offline when last fetch earlier than 3 hours
  if (hourDifference < 3) {
   firebase
     .firestore()
     .disableNetwork()
     .then(actionFn)
     .then(logToStorageFn)
  } else {
   firebase
       .firestore()
       .enableNetwork()
       .then(actionFn)
       .then(logToStorageFn)
  }
}

这可以是一个实用程序 function,用于特定页面 session 的所有Firestore操作。现在您要做的是传递一个唯一标识符以及您要执行的任何离线或在线操作; 可能是获取、插入、更新或删除; 使用 function。您将确定 function 根据上次读写时间在离线或在线模式下执行。

strategicFirestoreReadWrite(window.location.href, () => {

   //whatever operation you want to perform in online or offline mode
})

你列出了很多不错的选择。 我们在我们的应用程序中使用分页来限制读取查询并提高加载速度。 例如,我们每页只显示 50 个项目,并在点击或滚动时加载更多(无限滚动)如果数据不经常更改,您可以将其缓存在前端,但这会引入很多额外的问题:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM