首页 > 解决方案 > 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 实时数据库缓存了查询,它会在该日期之后创建新帖子时下载所有内容吗?或者它只会下载新帖子并从缓存中获取其他帖子?

标签: firebaseflutterfirebase-realtime-database

解决方案


如果您有侦听器的位置/查询发生更改,Firebase 会对该数据执行所谓的增量同步。在这个增量同步中,客户端计算其内部数据版本的子树上的哈希值,并将其发送到服务器。服务器将这些哈希值与它自己的子树的哈希值进行比较,并且只发回哈希值不同的子树。这通常比完整数据小很多,但不一定是最小增量。

请注意,无论您是否启用磁盘持久性,Firebase 都会始终在内存中已用于查询/位置的数据与服务器上的数据之间执行增量同步。启用磁盘持久性仅意味着内存中的副本最初将从磁盘填充,但之后增量同步在两种情况下的工作方式相同。


推荐阅读