Firebase 是否缓存数据? [英] Does Firebase cache the data?

查看:27
本文介绍了Firebase 是否缓存数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I read somewhere a claim that Firebase caches the data.

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

So I ran this test that reads a semi large volume of data (about 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);
}

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

As you can see, the first time it loads data it takes a while, and subsequent calls take much less time.

firebase 回复时间:1279.422 毫秒

firebase answered in: 1279.422ms

firebase 回复时间:236.378 毫秒

firebase answered in: 236.378ms

firebase 响应时间:228.595 毫秒

firebase answered in: 228.595ms

firebase 响应时间:202.700 毫秒

firebase answered in: 202.700ms

firebase 回复时间:208.371 毫秒

firebase answered in: 208.371ms

firebase 回复时间:214.807 毫秒

firebase answered in: 214.807ms

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

But, still, if the data is cached locally ~200ms (sometimes more) seems like a lot of time to access local data. Enough for the user to perceive a delay when rendering the UI.

那么 Firebase 会缓存数据吗?在那些 ~200ms 中发生了什么?

So is Firebase caching the data? What is happening in those ~200ms?

推荐答案

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

Firebase caches the data (in memory) for as long as there is an active listener for that data.

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

Since your code uses only once() listener, the listener is detached immediately when the data is received (before your callback is invoked) and the data is cleared from the cache. That means that is has to get the data from the servers for each once(), which apparently is a 200ms round-trip in your case. The first load is slower, because the connection is likely established in that call.

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

A quick trick to verify this is to add a permanent listener before starting your loop:

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);
}

通过这个简单的改变,日志变成:

With that simple change, the logging turns into:

firebase 回复时间:580.575 毫秒

firebase answered in: 580.575ms

firebase 回复时间:4.040 毫秒

firebase answered in: 4.040ms

firebase 回复时间:7.569 毫秒

firebase answered in: 7.569ms

firebase 回复时间:5.739 毫秒

firebase answered in: 5.739ms

这篇关于Firebase 是否缓存数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆