Хранит ли Firebase данные?

Я где-то читал выражение о том, что Firebase кэширует данные.

Итак, я запустил этот тест, который читает полу большой объем данных (около 400 КБ).

Вот соответствующий код.

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.422мс

firebase ответил: 236.378мс

firebase ответил: 228.595мс

firebase ответил: 202.700мс

firebase ответил: 208.371мс

firebase ответил: 214.807мс

и т.д.

Но, все же, если данные кэшируются локально ~200ms (иногда больше), похоже, много времени для доступа к локальным данным. Достаточно для пользователя, чтобы воспринимать задержку при визуализации пользовательского интерфейса.

Итак, Firebase кэширует данные? Что происходит в этих ~200ms?

Ответы

Ответ 1

Firebase кэширует данные (в памяти) до тех пор, пока для этих данных есть активный прослушиватель.

Так как ваш код использует только once() прослушиватель, слушатель отключается сразу же после получения данных (до того, как вызывается обратный вызов), и данные очищаются из кеша. Это означает, что необходимо получить данные с серверов для каждого once(), который, по-видимому, составляет 200 мс в оба конца в вашем случае. Первая загрузка медленнее, потому что соединение, вероятно, установлено в этом вызове.

Быстрый трюк, чтобы проверить это, - добавить постоянный слушатель перед запуском цикла:

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.575мс

firebase ответил: 4.040ms

firebase ответил: 7.569мс

firebase ответил: 5.739мс