Firebase - 缓存是否能提高性能?

15

我正在使用Firebase构建一个Web应用程序,它以两种不同的方式呈现相同的数据- 列表和在谷歌地图上作为标记。

目前,在每个视图 - 地图或列表 - 中,我都有代码来从Firebase查询数据,合并数据并进行显示。相反,我考虑了这个计划:在启动时查询数据,合并数据,并将所有数据保存到数组中,然后在视图之间传递此数组。

在某种意义上,我在一个数组中“缓存”Firebase数据。这在某种意义上并不理想-缓存数据没有直接从Firebase查询的数据那么及时。另一方面,我只调用Firebase一次。

这样做是否具有性能意义?从Firebase读取数据与从数组读取数据所需的时间是否同级别?

1个回答

23
一般来说,为了减少对Firebase的使用,缓存数据是不必要的。Firebase在客户端上维护自己的“活动”数据缓存。其中,“活动”数据被定义为正在对其执行“on”调用的数据。因此,对于任何活动数据,任何额外的“on”或“once”调用都将不需要网络流量,因为数据已经被加载。
我不太确定你所说的“查询Firebase”的意思。Firebase没有传统意义上的查询,它只有用于附加回调的方法。您是否使用“once()”函数从Firebase定期获取数据?如果是这样,这可能非常低效。once()是一种方便的方法,通常仅用于极少访问或由于某种原因开发人员不希望实时更新的数据。如果当once()完成时没有任何活动的“on”调用,Firebase将刷新该数据的缓存,并且任何后续对once()的调用都需要往返于服务器之间。
如果您想以高效的方式同步访问最新版本数据的本地副本,则建议使用以下方法:
var savedSnapshot = null;
dataRef.on("value", function(snapshot) {
  savedSnapshot = snapshot;
});

//and then when you need to read the data
var theData = savedSnapshot.val()

通过只保留一个on()调用,Firebase 可以在数据变化时只发送增量数据,而不是每次需要数据时重新加载全部数据,从而使您的数据保持最新。


1
很好的解释。顺便说一下,文档给人这样的印象,但没有详细说明(这可能是文档的一个很好的附录)。 - Kato
1
我们计划在不久的将来在文档中添加一些关于性能方面的章节。 - Andrew Lee
@AndrewLee 这个性能部分会被写吗?我已经使用 Firebase 两年了,但是当这个(五年前的)答案解释如何存储数据快照以供以后使用时,我并没有完全“领悟”。现在我意识到,我一直在进行防御性编码,因为我担心不知道 Firebase 内部“缓存”什么和不缓存什么。我现在看到 DataSnapshot 只是一个可导航的光标,指向内部不可变数据结构,并且 val() 将其数据克隆到 POJO 中。这设计得太优雅了!致敬 :-) - skrebbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接