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

2023-11-30

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

说我有这个只读称为产品的集合,其中包含大约 5000 个文档,因此当用户访问我的 React 应用程序时,每次访问将收取 5000 次读取费用。

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

由于如果用户垃圾邮件刷新以反应应用程序,这会很快消耗读取计数,是否有任何proper如何从 firebase firestore 读取数据?

  1. 将产品信息存储在本地存储中

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

    • 这个想法类似于本地存储,但我们可以使用 SOURCE 来代替本地存储。 CACHE 通过强制 Firebase 进入离线模式来从缓存中检索数据。来源 :https://firebase.google.com/docs/firestore/manage-data/enable-offline
    • 如何使用缓存避免不必要的 Firestore 读取,这是最接近我当前查询的,但我的集合只是只读数据,不会更新我可能无法添加快照侦听器。如果我误解了该功能,请告诉我。
  3. 限制读取查询?

    • 限制每次加载返回固定数量的文档,但最终我仍然需要加载全套文档,因此我对此非常怀疑。

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

谢谢。


您绝对应该引入分页策略。另一种聪明的方法是根据上次突变时间进行查询。如果满足以下条件,Firestore 会自动在网络中缓存您的数据:enablePersistence已配置(否则设置为 false)。

您可以引入一种策略,仅在经过一定时间后才使用网络进行查询。不过,您需要在最后一次在线查询进行时跟踪每个模块。

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)
  }
}

这可以成为您所有的实用功能Firestore针对特定页面会话的操作。现在你要做的就是传递一个唯一的标识符以及你想要执行的任何离线或在线操作;也许是获取、插入、更新或删除;有一个函数。您将确保该功能根据上次读写时间在离线或在线模式下执行。

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

   //whatever operation you want to perform in online or offline mode
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优化云Firestore中的读写操作? 的相关文章

随机推荐

  • 五个按钮保持等距圆周旋转

    我想在半径为 100 的圆 以 120 120 为中心的圆 实际上是正方形视图的中心 即 240 240 的圆周上旋转五个按钮 是否可以这样做 与按钮进行交互它们是旋转的且外观正确 我努力了 x round cx redious cos a
  • Nullable 和 Int32 类型之间未定义 Equal

    我正在编写一个无聊的应用程序来管理患者及其临床病史 我将 SQLite 与 DbLinq 库和 DbMetal 代码生成实用程序结合使用 以下是从底层数据库中提取的生成代码中的两个类 Table Name main Patients pub
  • 比较两个图像以检查它们是否相同

    我有一个带有 ImageView 的配置文件视图 用户可以在其中更改他们的图片 我正在保存我的新旧图像以进行比较 我想知道它们是否相同 所以如果是 我不需要将新的推送到我的服务器 我尝试了这个 但它并没有真正起作用 NSData retur
  • 为 tomcat jndi 连接到 postgresql 提供证书

    我想使用 jndi 从 tomcat 中的 servlet 连接到 postgresql 服务器 我已使用将服务器证书添加到信任库中keytool keystore usr lib jvm java 11 openjdk amd64 lib
  • 跨域资源共享 GET:“拒绝从响应中获取不安全标头“etag””

    没有自定义标头的简单 GET 请求 响应按预期返回 正文中的数据是可访问的 但标头则不可访问 当我尝试访问 etag 标头时 浏览器引发异常 拒绝获取不安全标头 etag Chrome Safari 和 Firefox 的行为都是相同的 我
  • 来自networkx的g.nodes()不能与random.choice()一起使用

    我正在尝试在随机节点之间生成随机边 但是代码行ab choice G nodes 正在产生错误 import networkx as nx import matplotlib pyplot as plt from random import
  • 如何将 PHP 变量传递给 Angular js?

    我有一个页面 我在 Angular JS 中进行逆向工程 所有内容都通过 PHP 脚本进行回显 我知道这是不好的做法 但我正在慢慢使用 Angular 只是想将其用于 onBlur 事件 我试图弄清楚如何将变量从 PHP 传递到 Angul
  • 简化 Prolog 中的表达式

    我想问一下如何简化表达式 例如 1 2 a 5 0 b c 0 3 a 5 特别是如何在列表中分离这些表达式 这在 Prolog 中实际上很有趣 因为你不需要做任何太神奇的事情就可以让它工作 X Y 1 2 a 5 0 b c 0 X 1
  • 如何在C语言中解读一个单词并在txt文件中找到它的所有匹配项?

    因此 给定一个最多 7 个字母的字符串 我需要找到该字符串的每个排列 包含和不包含所有字母 然后检查是否可以在我的dictionary txt 文件中找到这些排列中的任何一个 并打印那些排列匹配 所以基本上 如果用户输入 try 排列将是
  • Objective-C 单例对象和全局变量

    我知道有关此主题的其他帖子 但我实际上只是从新手的阶梯上爬升的一个人 所以需要更多帮助 我的 iPhone 应用程序有几个全局变量 其中一些变量是我在类中声明并给定值的 但其他变量需要在登录过程中设置 例如令牌 然后需要可以从任何类访问应用
  • 如何通过 .NET 代码压缩和修复 ACCESS 2007 数据库?

    我需要压缩并修复 Access 2007 accdb 数据库文件 我知道 JRO JetEngine 可以使用 mdb 文件执行此操作 但我需要通过代码修复较新版本的 2007 格式 有什么建议么 EDIT 事情是这样的 我发现我可以使用
  • 有没有办法找到带有标准库的应用程序的路径?

    我想知道是否可以在 Windows 7 下找到具有标准 python 2 7 库的应用程序 例如 MS Excel 的安装目录 我的意思是 它不应该使用任何 pywin32 或 xlrd 等 也许它会查找注册表来找到安装路径 这可能非常棘手
  • 删除图像中的所有水平线和垂直线

    我想删除所有水平和垂直线 但一些小的垂直线没有被删除 添加输入和输出图像以及下面的代码 string ImageUrl C Users Jayant Desktop test images rtaImage tiff Image
  • Next.js defaultLocale 创建到同一页面的两条路由(带前缀和不带前缀)

    根据子路径路由文档对于 Next js i8n 默认区域设置没有前缀 但我的问题是 将其添加到我的 next config js 时 i18n locales en defaultLocale en localeDetection fals
  • 从 LambdaMetafactory 创建 BiConsumer

    我试图通过 LambdaMetafactory 动态创建 BiConsumer 类型的方法引用 我试图应用在https www cuba platform com blog think twice before using reflecti
  • HTTPS 连接 Python

    我正在尝试验证该目标是否公开了 https Web 服务 我有通过 HTTP 连接的代码 但我不确定如何通过 HTTPS 连接 我读过您使用 SSL 但我也读到它不支持证书错误 我得到的代码来自 python 文档 import httpl
  • 无需 jQuery 即可更改元素文本?

    我试图在不使用 jQuery 的情况下更改 div 的内容 我想通过 id 或 class 选择 div 我已经设法让附加工作 function appendHtml targetC htmldata var theDiv document
  • 使用 FFMPEG 从 FPS 不正确的视频和包含每帧时间戳的文件创建具有正确 FPS 的视频

    我有一个从网络摄像头捕获并在 python 中使用 OpenCV 的视频文件 网络摄像头标称 FPS 为 30 FPS 但由于环境的原因 实际 FPS 有所不同 有时可能低至 24 FPS 录制的视频是使用 OpenCV 创建的VideoW
  • 如何使 $_GET 更安全?

    我正在使用 get 方法来执行一些操作 例如批准 标记垃圾邮件 删除 评论系统 我知道走这条路非常不安全 但我无能为力 因为使用 GET 方法的原因是使用 PHP SELF 在页面本身内执行操作 仅供参考 我也使用带有复选框的 post 方
  • 如何优化云Firestore中的读写操作?

    我目前正在编写一个 React Firebase 项目用于学习目的 我想知道我应该采取哪种方法来有效地从 Firebase 中读取数据 说我有这个只读称为产品的集合 其中包含大约 5000 个文档 因此当用户访问我的 React 应用程序时