Firebase RTDB:本地缓存更新时查询延迟

问题描述 投票:0回答:1

我在尝试运行查询时遇到了 RTDB 的问题:数据有很大的延迟。我的步骤如下。

  1. 首先我设置所有数据都会被缓存,调用

    db.getReference("timeline").keepSynced(true)
    。我的所有时间线数据约为 40-50 MB。我还将 Firebase SDK 本地缓存大小设置为最大 100 MB,这样
    db.setPersistenceCacheSizeBytes(104857600L)

  2. 之后我运行查询来获取时间线,请参见下文。安装应用程序后的第一个查询速度非常快,大约需要 2-5 秒。但是下一次这个查询可能会花费更多的时间,大约1-2分钟甚至更多。请查看下面的日志。

查询:

Timber.d("getTrips getTimelineCloud $dayTag")
val ref = database.getReference("timeline/240416/trips")
ref.get().addOnCompleteListener { task ->
    Timber.d("getTrips getTimelineCloud $dayTag result size = ${task.result.childrenCount}")
}

数据:我正在查询位于

timeline/240416/trips
的当前日期行程数据,如下所示(约150KB)

{
  "405": {
    "finishStation": "Ettelbruck",
    "finishTime": 1712725980000,
    "startStation": "Rodange",
    "startTime": 1712721072000
  },
  "406": {
    "finishStation": "Ettelbruck",
    "finishTime": 1712729580000,
    "startStation": "Rodange",
    "startTime": 1712724672000
  },
  "407": {
    "finishStation": "Ettelbruck",
    "finishTime": 1712733180000,
    "startStation": "Rodange",
    "startTime": 1712728272000
  },
  // 800+ items below, it takes 150KB
}

日志:

18:40:12.548 TimelineManager            D  getTrips getTimelineCloud 240416
18:42:06.487 TimelineManager            D  getTrips getTimelineCloud 240416 result size = 1066
android firebase-realtime-database
1个回答
0
投票

由于您在整个

keepSynced(true)
节点上调用
timeline
,因此本地缓存将包含该节点下的所有 JSON 数据。鉴于您指示的 40-50MB,这是大量子节点。

当您针对时间轴运行查询时,Firebase 将首先将所有数据从缓存加载到内存中,这需要一定的时间(和内存),该时间与路径/路径中的子节点的数量和大小成线性关系。缓存。

实时数据库的缓存行为是针对离线时重新运行与在线时运行的相同查询的情况进行/优化的。您的用例似乎有所不同:您正在预加载然后想要在离线时查询的数据。虽然一切在技术上都可行,但我怀疑你们能否在如此大的数据下获得令人满意的性能。

我建议主要查看本地数据库。 Firestore 更适合这种类型的使用,因为它的本地缓存由实际数据库支持,已建立索引并且不依赖于内存。不过,为了完全控制您的可扩展性,请考虑是否应该使用本地优先/仅本地数据库,并且仅使用 Firebase 将数据从云数据库同步到设备(如果是的话)。

© www.soinside.com 2019 - 2024. All rights reserved.