Firebase会缓存数据吗?

Pie*_*ier 23 javascript firebase firebase-realtime-database

我在某处读到了Firebase缓存数据的说法.

所以我运行了这个测试,读取了大量的数据(大约400KB).

这是相关的代码.

firebase.initializeApp(config);

var counter = 0;

console.time('firebase answered in');
firebase.database().ref('texts').once('value',onData);

function onData(snapshot){
  console.timeEnd('firebase answered in');

  counter ++;
  if(counter > 20) return;

  setTimeout(function(){
    console.time('firebase answered in');
    firebase.database().ref('texts').once('value',onData);
  },2000);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,第一次加载数据需要一段时间,后续调用花费的时间要少得多.

firebase的回答:1279.422ms

firebase的回答:236.378ms

firebase的回答:228.595ms

firebase回答:202.700ms

firebase的回答:208.371ms

firebase回答:214.807ms

等等

但是,如果数据在本地缓存~200ms(有时更多)似乎需要大量时间来访问本地数据.足以让用户在渲染UI时感知延迟.

Firebase缓存数据也是如此吗?那些发生了~200ms什么?

Fra*_*len 36

只要存在该数据的活动侦听器,Firebase就会缓存数据(在内存中).

由于您的代码仅使用once()侦听器,因此在接收数据时(在调用回调之前)立即分离侦听器,并从缓存中清除数据.这意味着必须从服务器获取每个数据once(),这显然是你的情况下的200ms往返.第一个加载速度较慢,因为可能在该调用中建立了连接.

验证这一点的快速技巧是在开始循环之前添加永久监听器:

firebase.initializeApp(config);

var counter = 0;

console.time('firebase answered in');
firebase.database().ref('texts').on('value',function() {});
firebase.database().ref('texts').once('value',onData);

function onData(snapshot){
  console.timeEnd('firebase answered in');

  counter ++;
  if(counter > 20) return;

  setTimeout(function(){
    console.time('firebase answered in');
    firebase.database().ref('texts').once('value',onData);
  },2000);
}
Run Code Online (Sandbox Code Playgroud)

通过这种简单的更改,日志记录变为:

firebase回答:580.575ms

firebase回答:4.040ms

firebase回答:7.569ms

firebase回答:5.739ms

  • @FrankvanPuffelen,你说我们需要一个活跃的监听器来保持缓存.但是,你的第一个听众是'一次'.这不是一个积极的倾听者吗?不应该是'on`或者我错过了什么? (6认同)
  • 我所做的就是解释这种行为.这是否是您需要的,由您来决定.一般来说,我不是'once()`的忠实粉丝,在使用Firebase时它通常是一种反模式. (2认同)