Firebase:减少大型馆藏的读取次数

时间:2020-03-04 22:38:44

标签: angular firebase google-cloud-firestore

经过大量搜索,在阅读Firebase集合时,我发现了很多“不该做的事”(主要示例是3万美元的账单),但是我在努力寻找一个解决我们问题的合适方法。

我们的网站包含产品目录。该目录从名为“ products”的firestore集合中填充,其JSON结构为:

"products"{
   "productId"{
      "name":
      "price":
      "brand":
       ...
  }
}

为了加载集合,我使用以下内容:

this.products = this.db.collection('products').valueChanges({idField: 'productID'});

在高峰时期,我们预计该产品系列将包含多达2000种产品。我担心的是,随着网站的扩展,这将变得极其昂贵。我注意到,每次导航到“目录”页面时,它都会再次加载该集合。因此,以一个不太令人难以想象的示例为例,如果该页面一天被加载5000次并加载了完整的集合(如当前那样),则将导致至少读取10,000,000个文档。

我确定必须有更好的方法来执行此操作,但是,我似乎无法破解它。

任何建议都会以一种更好的方式来解决,并降低成本。

2 个答案:

答案 0 :(得分:4)

您的首页的普通访问者会看到多少产品?假设您在首屏显示5-10个产品,因此在滚动之前。如果50%的访问者立即离开页面(对于这种反弹来说,这是一个相当乐观的值),则您每天只需加载5,000次访问* 10个产品= 50,000次读取就可以满足一半的访问者的需求。

留在您网站上以查看更多内容的50%的访问者实际上是值得加载更多数据的访问者。但是我仍然会考虑优化

加载所有2,000种产品可能会对您的绝大多数访问者造成浪费,这就是为什么道格(Doug)建议对数据进行分页(或者如今更常见:使用无限滚动视图加载它们)。

一种更有效的替代方法是将最初的10种产品存储到单个文档中,本质上存储预先聚合的内容。如果这样做,您只需为每个访客阅读一份文档即可获得初始产品。然后,您可以像以前一样按需加载其余文档。

您可以进一步采用这种方法,并预先汇总多种类型的内容,例如每个类别中最受欢迎的产品,特定产品的相关产品等。虽然这些步骤中的每一个都使内容的生成更加棘手,但是如果您吸引了更多的访问者,您可以轻松地将其赚回来。

要在使用Cloud Firestore时了解所有有关此方面的信息以及许多其他注意事项,我建议推荐出色的视频系列Getting to know Cloud Firestore

答案 1 :(得分:3)

您可以:

  1. 使用browser's local storage来实现自己的本地缓存,并根据需要进行处理。
  2. 启用offline persistence并使用source options将查询定向到缓存。
  3. 使用pagination避免一次加载整个结果集。