【问题标题】:Firebase - does caching improve performance?Firebase - 缓存会提高性能吗?
【发布时间】:2012-08-13 01:18:00
【问题描述】:

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

现在,在每个视图(地图或列表)中,我都有代码可以从 firebase 查询数据,将其合并并显示。相反,我正在考虑这个计划:在启动时,查询数据,将其合并,然后将其全部保存到我在视图之间传递的数组中。

从某种意义上说,我正在将 firebase 数据“缓存”在一个数组中。这在某种意义上并不理想——缓存的数据不如直接查询 Firebase 那样最新。另一方面,我只调用 Firebase 一次。

这对性能有意义吗?从 Firebase 读取数据与从数组读取数据所用的时间是否相同?

【问题讨论】:

    标签: performance firebase


    【解决方案1】:

    一般来说,没有必要缓存数据来限制 Firebase 的使用。 Firebase 在客户端维护自己的“活动”数据缓存。 “活动”被定义为“开启”呼叫未完成的数据。因此,对于任何活动数据,任何额外的“on”或“once”调用都不需要网络流量,因为数据已经加载。

    我不完全确定您所说的“查询 firebase”是什么意思。 Firebase 没有传统意义上的查询。它只是具有附加回调的方法。您是否使用“once()”函数定期从 Firebase 获取数据?如果是这样,这可能是非常低效的。一次是一种方便的方法,通常只应用于极不经常访问的数据或由于某种原因开发人员不想实时更新的数据。如果在 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 能够通过仅在事情发生变化时通过网络发送增量来保持您的数据最新,而不是在您每次需要时重新加载所有数据。

    【讨论】:

    • 很好的解释。顺便说一句,文档给人的印象是,但没有详细说明(这可能是文档的一个很好的附录)
    • 我们计划在不久的将来在文档中添加一些关于性能的部分。
    • @AndrewLee 这个性能部分会写吗?我已经使用 Firebase 2 年了,当这个(5 岁的)答案解释了如何存储数据快照以供以后使用时,我并没有完全“点击”。我现在意识到我一直在进行大量的防御性编码,因为我害怕不知道 Firebase 在内部做什么和不“缓存”。我现在看到 DataSnapshot 只是内部不可变数据结构的可导航游标,val() 将其数据克隆到 POJO 中。这设计太优雅了!脱帽:-)
    猜你喜欢
    • 2013-09-27
    • 2018-04-03
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多