【问题标题】:How does deletion work with cloud firestore caching?删除如何与 Cloud Firestore 缓存一起使用?
【发布时间】:2021-09-21 03:11:24
【问题描述】:

假设我有一个包含数万个文档的集合,我将整个集合存储在客户端的缓存中,以避免每次打开应用程序时进行大量不必要的读取。要获取最新的内容,客户端只需要在上次获取之后查询所有具有last_modified 时间的文档。这在创建或更新集合中的文档时非常有用,但是当您想要删除某些内容时会发生什么?如果一个客户端将它从数据库中删除,那么其他客户端将永远不会意识到它丢失了,如果您添加一个 deleted 字段,那么它将永远占用服务器上的存储空间以及曾经获取它的每个客户端。

有什么技术可以处理这种事情?如果有必要解决这个问题,我愿意对我描述的架构进行重大更改,所以我更喜欢“重新开始并像这样做”的答案,而不是“这是不可能的”。我考虑过在添加新内容而不是创建新内容时重用已删除的文档,但这仍然意味着数据库永远不会缩小。

总的来说,我的应用的要求是:

  1. 我需要以某种方式进行缓存,因为我有太多文档需要不断阅读它们,而且离线支持很重要
  2. 我需要能够添加、编辑和删除文档,以便多个客户端可以有效地获取这些更新,并且删除文档可以释放空间

编辑:我用来提高查询性能的方法来自this page 底部的文档。我正在制作一个时间跟踪器,其中每个活动都是一个非常轻量级的文档(

【问题讨论】:

  • 我认为article 可能会有所帮助。

标签: google-cloud-firestore


【解决方案1】:

对文档读取的 API 调用进行微优化通常不是使用 Firestore 的最佳方法。

为了获取最新的内容,客户端只需要在上一次获取之后查询所有具有last_modified时间的文档。

如果所有文档都已在本地缓存中,则执行这样的查询将一无所获。

假设您已经缓存了 1,000 个文档,并且添加或更新了一个。执行查询会导致从服务器读取一个文档,但读取整个集合也是如此。


这里的一个更好的问题是,您为什么要读取和缓存 1,000 个文档?您的应用程序的普通用户真的会看到所有这 1,000 个文档吗?在一个屏幕上显示的信息似乎非常多。

最好只加载第一屏信息,然后按需加载其余信息。


您还可以考虑是否真的需要整个文档。例如:如果您只显示每个文档的标题,您是否可以将 1,000 个标题合并到一个文档中(例如称为 recent_headlines)并加载它。


最后,考虑使用数据包到bundle updates togetherserve them from a CDN 并减少您为文档读取付费的次数。

【讨论】:

  • 我不认为我在做的是微优化,我用推理更新了我的问题。我对你在这里所说的有点困惑——“但简单地阅读整个收藏也是如此。”我会认为会产生 1000 次读取,不是吗?此外,我不会直接将 1000 个文档放在屏幕上,但我可能想计算它们之间的特定聚合,如果我有完整列表,这将很容易做到,但尝试预先计算会很复杂,因为有很多种聚合。
  • " 我原以为会产生 1000 次读取,不是吗?"如果您已经在本地缓存中拥有原始 999 文档,则不会。 “计算它们之间的特定聚合”我强烈建议在写入操作时执行此类聚合,这通常会大大减少必要的读取次数。即席查询不是大多数 NoSQL 数据库的强项,而且在 Firestore 上绝对不经济。
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多