firebase - Flutter 上的 Firebase 实时数据库缓存行为
问题描述
我试图了解 Firebase 实时数据库如何使用缓存。该文档没有阐明有关缓存处理的某些情况。尤其是对于 Flutter,没有文档和在线资源是不够的。有两种不同的情况让我感到困惑。
首先,我从为两种场景设置缓存开始:
await FirebaseDatabase.instance.setPersistenceEnabled(true);
await FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000);
场景一:我倾听特定用户的价值。我想一次性下载用户数据。然后,始终使用缓存并仅下载更新(如果有):
final stream = FirebaseDatabase().reference().child("users").child("some_id").onValue();
据我了解,Firebase 会先下载节点,如果没有更新,稍后再使用缓存。即使应用程序重新启动,这也不会改变。
场景 2:我想查询仅在日期之后创建的帖子:
final date = DateTime(2020,6,20);
final data = await FirebaseDatabase().reference().child("posts").orderByChild("createdAt").startAt(date).once();
对于场景 2,我不确定缓存将如何完成。如果 Firebase 实时数据库缓存了查询,它会在该日期之后创建新帖子时下载所有内容吗?或者它只会下载新帖子并从缓存中获取其他帖子?
解决方案
如果您有侦听器的位置/查询发生更改,Firebase 会对该数据执行所谓的增量同步。在这个增量同步中,客户端计算其内部数据版本的子树上的哈希值,并将其发送到服务器。服务器将这些哈希值与它自己的子树的哈希值进行比较,并且只发回哈希值不同的子树。这通常比完整数据小很多,但不一定是最小增量。
请注意,无论您是否启用磁盘持久性,Firebase 都会始终在内存中已用于查询/位置的数据与服务器上的数据之间执行增量同步。启用磁盘持久性仅意味着内存中的副本最初将从磁盘填充,但之后增量同步在两种情况下的工作方式相同。
推荐阅读
- swift - SwiftUI - 将 ZStack 调整为图像大小?
- javascript - 向滚动条添加填充
- excel - 如何使用 VBA 动态限制 Excel 中的滚动区域?
- javascript - NodeJS - 返回始终挂起,但 console.log 显示正确的数据
- angular - 如何使子路由在角度嵌套路由中占据整页
- redirect - IIS 重定向规则不适用于特定文件夹
- android - Android 我的底部应用程序栏与我的回收站视图重叠
- azure-devops - 您如何衡量一个功能在 azure devops 中每个州的花费?
- maven - maven M2_Home 应该是什么?
- angular - 想要循环订阅 API 调用