高Firebase下载

Mar*_*ark 5 javascript firebase firebase-realtime-database

我有一个具有2k用户的React Native应用程序。所有用户数据均以以下格式存储在Firebase中: Firebase数据结构

因此,每个用户都有一个禁食列表,他们通常每天在其中创建一个禁食。很少的数据。这是我的数据库使用情况图:

Firebase使用情况

一些观察:

  • 27日下载了134MB。数据库的总大小为.5MB。134MB / .5MB =下载整个数据库的268倍。这意味着每个用户将下载他们的数据268次,这是极不可能的。我的Firebase规则: Firebase规则 因此,用户不可能下载其他用户的数据。我运行了Firebase Profiler约11分钟: Firebase Profiler

我很沮丧 最后,这是我的一个文件,除了登录/注销外,它几乎执行所有Firebase操作:

import * as firebase from 'firebase';
import moment from 'moment'
import {
  currentFastChanged,
  setGraphData,
  setAllData,
  targetFastChanged,
  setLastFastEnd,
usernameChanged,} from '../actions/actions'
// Initialize Firebase
var firebaseConfig = {
};
export const firebaseApp = firebase.initializeApp(firebaseConfig);

function syncFirebase(store) {

  firebaseApp.auth().onAuthStateChanged(function(user) {
    if (user)
    {
      getUserRef().child('TargetFast').on('value', (snap) => {
        store.dispatch(targetFastChanged(snap.val() ? snap.val() : 15));
      });

      getUserRef().child('Fasts').on('value', (snap) => {
        var items = [];
        snap.forEach((child) => {
          items.push({
            start: child.val().Start,
            end: child.val().End,
            _key: child.key
          });
        });

        items.sort(function(a, b) {
           return parseInt(b.start) - parseInt(a.start);
       });
       store.dispatch(setGraphData(createGraphData(items, store.getState().myReducer.targetFast)));
       store.dispatch(setLastFastEnd(getLastFastEnd(items)));
       store.dispatch(setAllData(items));
     });

     getUserRef().child('CurrentFast').on('value', (snapshot) => {
       store.dispatch(currentFastChanged(snapshot.val()));
     });

   });

    }
  })

}

function getUserRef()
{
  return firebaseApp.database().ref('Users/' + firebaseApp.auth().currentUser.uid);
}

function createGraphData(items, targetFast) {

 var graphItems = [];
 var idx = 0;
 for(idx = 0; idx < 7 && idx < items.length; idx++)
 {
   var item = items[idx];
   graphItems.push({
     duration : moment.duration(item.end - item.start).asHours(),
     label : moment(item.start).format('ddd'),
     item : item
   });
 }

 while(graphItems.length < 7)
 {
   var add = targetFast * .2 * (Math.random() - .5);
   var randomVal = targetFast + add
   graphItems.push({duration : randomVal, label : "na", color : 'lightgrey', });
 }
  return graphItems.reverse();
}

function getLastFastEnd(items) {
  return items.length && items[0].end;
}

export function setCurrentFastRef(val)
{
  getUserRef().child('CurrentFast').set(val);
  //firebaseApp.database().ref('Users/' + firebaseApp.auth().currentUser.uid + '/CurrentFast').set(val);
}

export function pushNewFast(start, end)
{
  getUserRef().child('Fasts').push({'Start': start, 'End': end, 'Publish' : true})
}

export function editFastRef(key, start, end)
{
  getUserRef().child('Fasts').child(key).set({'Start' : start, 'End' : end});
}

export function deleteFastRef(key)
{
  getUserRef().child('Fasts').child(key).remove();
}

export function setTargetFastRef(val)
{
  getUserRef().child('TargetFast').set(val);
}

module.exports = firebaseApp;
module.exports.sync = syncFirebase;
module.exports.serverTimestamp = firebase.database.ServerValue.TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

我的账单在15天左右的时间里一直是$ 1,看起来好像是微不足道的数据量。我目前的怀疑是:

  • 侦听器只是多次堆积和下载数据。监听器不会被删除

  • 开销不是我的错(SSL?)

  • ??? 有任何想法吗?