Firebase会缓存数据吗?

时间:2016-07-17 16:13:42

标签: javascript firebase firebase-realtime-database

我在某处读到Firebase缓存数据的声明。

所以我运行了this test,读取了大量的数据(大约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);
}

正如您所看到的,第一次加载数据需要一段时间,而后续调用则需要更少的时间。

  

firebase回答:1279.422ms

     

firebase回答:236.378ms

     

firebase回答:228.595ms

     

firebase回答:202.700ms

     

firebase回答:208.371ms

     

firebase回答:214.807ms

     

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

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

1 个答案:

答案 0 :(得分:33)

只要存在该数据的活动侦听器,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);
}

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

  

firebase回答:580.575ms

     

firebase回答:4.040ms

     

firebase回答:7.569ms

     

firebase回答:5.739ms