Flutter上的Firebase实时数据库缓存行为

时间:2020-06-25 23:23:34

标签: firebase flutter firebase-realtime-database

我试图了解Firebase Realtime Database如何使用缓存。该文档未阐明有关缓存处理的某些情况。特别是对于Flutter,没有文档,而且在线资源还不够。我很困惑两种情况。

首先,我首先设置两种情况的缓存:

await FirebaseDatabase.instance.setPersistenceEnabled(true);
await FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000);

方案1:我听的是特定用户的价值。我想一次下载用户数据。然后,请始终使用缓存并仅在有更新时下载更新:

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 Realtime Database缓存了查询,那么在该日期之后创建新帖子时,它将下载所有内容吗?还是只下载新帖子并从缓存中获取其他帖子?

1 个答案:

答案 0 :(得分:0)

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

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