GVKun编程网logo

如何避免使用缓存进行不必要的Firestore读取(如何避免缓存中断)

13

此处将为大家介绍关于如何避免使用缓存进行不必要的Firestore读取的详细内容,并且为您解答有关如何避免缓存中断的相关问题,此外,我们还将为您介绍关于FirebaseFirestoreonSnaps

此处将为大家介绍关于如何避免使用缓存进行不必要的Firestore读取的详细内容,并且为您解答有关如何避免缓存中断的相关问题,此外,我们还将为您介绍关于Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空、Firebase Firestore如何读取计数?、firebase 实时数据库下载定价与 Firestore 读取、Firestore 错误 - firebase:emulator:start - Firestore 模拟器已退出,代码:1的有用信息。

本文目录一览:

如何避免使用缓存进行不必要的Firestore读取(如何避免缓存中断)

如何避免使用缓存进行不必要的Firestore读取(如何避免缓存中断)

我有按日期排序的旅行数据(大集合)列表。

现有行为

我将所有行程数据存储到SqlLite
Db中。对于添加的每个新数据,我通常都会收到fcm通知,并且使用上次更新的时间概念仅同步新添加的数据。这样,当cx打开应用程序时,他将始终从我的数据库中读取数据,从而节省了
读取网络 操作。

如何使用Firestore达到相同的目的?

需要考虑的几个问题:

  • Firestore get()始终尝试首先从服务器获取数据,即使我将CACHE添加到查询中,如何仅同步更新的文档
  • 在我的Recyler视图中,我希望按字段 日期 而不是lut(last-modified-time)对数据进行排序
  • 使用FireStore Snapshot Listener,我无法查询这么大的记录集。

答案1

小编典典

Firestore get()始终尝试首先从SERVER获取数据,即使我将CACHE添加到查询中,如何仅同步更新的文档?

根据有关启用脱机数据的官方文档:

对于Android和iOS,默认情况下启用离线持久性。

因此,要使用离线持久性,您无需对代码进行任何更改(“添加”)即可使用和访问Cloud Firestore数据。

同样根据有关Query的get()方法的官方文档:

默认情况下,get()尝试通过等待来自服务器的数据来尽可能地提供最新数据,但是如果您离线并且无法访问服务器,它可能会返回缓存的数据或失败。可以通过Source参数更改此行为。

因此,这是正常的行为。从2018-06-13(16.0.0
SDK)开始,现在可以指定我们要从中获取数据的来源。我们可以借助DocumentReference.get(Source
source)和Query.get(Source
source)方法来实现。

正如你所看到的,我们现在可以作为参数传递给DocumentReference或给Query源,以便我们可以强制数据的检索从serveronlychache only或尝试服务器,并回落到缓存中。

因此,现在可以执行以下操作:

yourDocRef.get(Source.SERVER).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {    @Override    public void onSuccess(DocumentSnapshot documentSnapshot) {        //Get data from the documentSnapshot object    }});

在这种情况下,我们强制仅从服务器检索数据。如果要强制将只从缓存中检索数据,您应该作为参数传递给get()方法,Source.SERVER。更多信息在这里。

如果只想获取updateddocuments,则可以查看快照之间的更改。官方文档中的示例为:

db.collection("cities")    .whereEqualTo("state", "CA")    .addSnapshotListener(new EventListener<QuerySnapshot>() {        @Override        public void onEvent(@Nullable QuerySnapshot snapshots,                @Nullable FirebaseFirestoreException e) {        if (e != null) {            Log.w(TAG, "listen:error", e);            return;        }        for (DocumentChange dc : snapshots.getDocumentChanges()) {            switch (dc.getType()) {            case ADDED:                Log.d(TAG, "New city: " + dc.getDocument().getData());                break;            case MODIFIED:                Log.d(TAG, "Modified city: " + dc.getDocument().getData());                break;            case REMOVED:                Log.d(TAG, "Removed city: " + dc.getDocument().getData());                break;            }        }        }    });

看到每个特定情况的switch语句吗?第二种情况将帮助您仅获取更新的数据。

在我的Recyler视图中,我希望按字段日期而不是lut(last-modified-time)对数据进行排序

在这种情况下,您应该创建一个查询,该查询允许您按特定的日期属性对结果进行排序。假设您具有一个如下所示的数据库结构:

Firestore-root   |   --- items (collection)        |        --- itemId (document)             |             --- date: Oct 08, 2018 at 6:16:58 PM UTC+3             |             --- //other properties

像这样的查询将帮助您实现:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();CollectionRefference itemsRef = rootRef.collection("items");Query query = itemsRef.orderBy("date", Query.Direction.ASCENDING);

使用FireStore Snapshot Listener,我无法查询这么大的记录集。

哦,可以。根据此答案,Firebase可以有效遍历数十亿个项目。该答案适用于Firebase实时数据库,但相同的原理也适用于Cloud Firestore。

Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空

Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空

这是由于 Firebase 调用的 "latency compensation":

您应用中的本地写入将立即调用快照侦听器。 这是因为一个称为“延迟补偿”的重要功能。 当您执行写入时,您的听众将收到新的通知 数据发送到后端之前的数据。

你的快照是在离开你的应用之前触发的,时间戳字段为null,然后在到达后端并设置时间戳后再次触发。

要区分两者,请使用文档中所述的字段 metadata.hasPendingWrites

Firebase Firestore如何读取计数?

Firebase Firestore如何读取计数?

计算一次Firestore文档的读取次数(如果您达到free quota limit,每天读取50K,则收取费用)在两种情况下:从Firebase控制台读取文档从您的应用中读取文档。


帮助我了解正确的使用方式

没有真正的“正确方法”。每次阅读Firestore文档(无论采用哪种方式)并且达到free quota limit(即每天阅读50K)时,您都需要支付一份文档费用。

您将在专用的Firestore doc中找到更多详细信息。

,

您也在charged for reads的控制台中。通常,在开发阶段这个数字很低,免费试用很容易覆盖。

如果您的文档过多,您可能希望为他/她构建一个单独的管理仪表板。使用

如果您只需为打开Firestore控制台收取的费用 ,则可以考虑创建一个名称为a的空白集合-这样,每当您加载Firestore控制台时, a集合已加载。

3 Firebase collection,first starting with a

firebase 实时数据库下载定价与 Firestore 读取

firebase 实时数据库下载定价与 Firestore 读取

如何解决firebase 实时数据库下载定价与 Firestore 读取?

众所周知,firebase rtdb 的读/写成本是免费的。通过多一点挖掘,我可以发现读/写实际上可以以非直接方式进行成本。好的,所以我一直在搜索文档和 SO 问题以弄清楚“FIRESTORE READING COST(每 100,000 个文档 0.06 美元)和实时数据库下载(1美元/GB)成本之间的确切区别是什么”,但遗憾的是我不能没能完成它。

RTDB 的存储数据成本(5 美元/GB)非常清楚,我知道价格是按月计费的(这个是真的,对吧?)。但究竟什么是下载成本?通过一些 SO 问题和官方文档,我可以发现 rtdb 下载成本与 firestore 读取成本非常相似,通过深入到最终路径来明确指定 db.ref 路径很重要。但是,如果下载成本都与这些操作有关,例如读取特定字段或路径中的json数据,那么firestore读取的概念与这些rtdb下载操作的概念有什么区别?

如果所有这些事情都已经发生在地球上,那么 RTDB 在“概念阅读”方面的成本永远不会免费,即使我们以直接的方式说话。那么为什么一些社区成员和 articles 总是说“RTDB 的读/写成本是免费的”?我正在考虑将某些功能从 firestore 迁移到 RTDB,因为众所周知 rtdb 可以免费读取和写入。该功能每月更新数百次大小为 500B 的单个路径(firestore 文档)。但是这个问题让我很困惑。

假设 firestore 的 100,000 次读取为 0.04 美元,RTDB 的下载(看起来像是读取)为 1 美元/GB。在我的计算中,从 firestore 读取 2,500,000 个文档等于从 RTDB 下载一个 GB。这意味着如果单个操作读取大于 400B(大约)的数据,firestore 读取成本甚至比 RTDB 读取成本更便宜。那么如果单个操作需要检索每个操作大于 400B 的数据,我就没有理由使用 RTDB 来读取数据。感觉我被错误的概念给抓住了,但要摆脱这个沼泽并不容易..]:

所以我希望搞清楚RTDB的读/写成本(如果它本身真的免费的话),以及为什么当应用程序要做很多事情时,使用RTDB比使用firestore更好读取操作(对我来说,例如每个用户每月检索 400B 大小的数据的大约 1,000 次操作)。我知道一些 firebase 专家感谢贡献 SO 的 firebase 标签.我试图尽可能清楚地写出问题,但认为问题中会有一些不清楚的部分。所以,评论将不胜感激!希望这个问题会影响到您.. 提前致谢 [:

解决方法

我创建了一个非常方便的 spreadsheet calculator,它可以计算每个用户的有效负载和比例的粗略大小,同时还考虑了免费套餐的使用情况。您可以在顶部输入您的值并获得不错的结果。

但总而言之,Realtime DB 的每 KB 读取成本非常高,而 Firestore 每次读取的额定值高达 1mb(潜力),而写入 Realtime 非常便宜,我已经确认除了开销外,可以免费写入实时数据库。

与 Firestore 相比,实时数据库并不经济,旨在涵盖 Firestore 的一些注意事项。读取(下载)的实时计费是(数据 + 开销)四舍五入到最接近的 kb

TLDR:

  • Firestore 是高读取、低写入、静态信息的理想选择。
  • 实时更适合低读取、高写入、易失性信息。
,

从 Firestore 读取文档时,您需要付费:

  1. Document reads - 在服务器上读取文档的成本。
  2. Network egress - 将数据下载到客户端的成本。

在大多数情况下,我们看到开发人员使用 Firestore 的成本更多来自文档读取,因为每 GB 的成本相对较低。


从实时数据库读取数据时,您只需支付:

  1. GB downloaded - 将数据下载到客户端的成本。

这里的成本主要来自您下载的数据大小。它与 Firestore 中的 Network egress 非常相似,但每字节读取的成本更高(当然,您无需为服务器本身的读取操作付费)。


虽然计算器(例如来自 DIGI Byte 的计算器,或 pricing page 上的计算器)将是最好的,但粗略的指导是,如果您执行许多小的读取和写入,RTDB 将一个更好的选择,而如果您执行更少的写入和/或更多的读取,那么 Firestore 通常是更好的选择。

Firestore 错误 - firebase:emulator:start - Firestore 模拟器已退出,代码:1

Firestore 错误 - firebase:emulator:start - Firestore 模拟器已退出,代码:1

如何解决Firestore 错误 - firebase:emulator:start - Firestore 模拟器已退出,代码:1?

我在使用 angular 11 应用程序,以前我有一个过时的 Java 版本,但即使在更新它并重新启动电脑后,我在尝试启动本地 firestore 模拟器时仍然收到错误消息。

我已经完成了:

  • npm i firebase @angular/fire
  • 在我的 angular 应用程序中添加了必要的配置/修改
  • firebase init(用于 Firestore、托管和 模拟器)
  • 在 firebase google 控制台上创建了一个 firestore 数据库
  • 更新到 Java sdk 16

有谁知道可能是什么问题?在过去的 2 个小时里,我一直在试图弄清楚。

Node 和 npm 版本

node - v15.12.0
npm - 7.6.3

我的java版本

java version "16" 2021-03-16
Java(TM) SE Runtime Environment (build 16+36-2231)
Java HotSpot(TM) 64-Bit Server VM (build 16+36-2231,mixed mode,sharing)

firebase-debug.log(firestore-debug.log 总是空的)

[debug] [2021-04-04T09:06:47.737Z] ----------------------------------------------------------------------
[debug] [2021-04-04T09:06:47.739Z] Command:       C:\PROGRA~1\nodejs\node.exe C:\Users\Dev\AppData\Roaming\npm\node_modules\firebase-tools\lib\bin\firebase.js --debug emulators:start
[debug] [2021-04-04T09:06:47.739Z] CLI Version:   9.8.0
[debug] [2021-04-04T09:06:47.739Z] Platform:      win32
[debug] [2021-04-04T09:06:47.739Z] Node Version:  v15.12.0
[debug] [2021-04-04T09:06:47.740Z] Time:          Sun Apr 04 2021 12:06:47 GMT+0300 (Eastern European Summer Time)
[debug] [2021-04-04T09:06:47.740Z] ----------------------------------------------------------------------
[debug] 
[debug] [2021-04-04T09:06:47.745Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[debug] [2021-04-04T09:06:47.747Z] > authorizing via signed-in user
[info] i  emulators: Starting emulators: firestore,hosting {"Metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: firestore,hosting"}}
[debug] [2021-04-04T09:06:47.762Z] [hub] writing locator at C:\Users\Dev\AppData\Local\Temp\hub-my-coffee-app-2.json
[debug] [2021-04-04T09:06:47.776Z] Ignoring unsupported arg: projectId {"Metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: projectId"}}
[debug] [2021-04-04T09:06:47.777Z] Ignoring unsupported arg: auto_download {"Metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: auto_download"}}
[debug] [2021-04-04T09:06:47.777Z] Starting Firestore Emulator with command {"binary":"java","args":["-Dgoogle.cloud_firestore.debug_log_level=FINE","-Duser.language=en","-jar","C:\\Users\\Dev\\.cache\\firebase\\emulators\\cloud-firestore-emulator-v1.11.12.jar","--host","127.0.0.1","--port",8080,"--rules","D:\\_Repos ?‍ ?\\my-coffee-app-pwa\\my-coffee-app-web\\firestore.rules"],"optionalArgs":["port","webchannel_port","host","rules","functions_emulator","seed_from_export"],"joinArgs":false} {"Metadata":{"emulator":{"name":"firestore"},"message":"Starting Firestore Emulator with command {\"binary\":\"java\",\"args\":[\"-Dgoogle.cloud_firestore.debug_log_level=FINE\",\"-Duser.language=en\",\"-jar\",\"C:\\\\Users\\\\Dev\\\\.cache\\\\firebase\\\\emulators\\\\cloud-firestore-emulator-v1.11.12.jar\",\"--host\",\"127.0.0.1\",\"--port\",\"--rules\",\"D:\\\\_Repos ?‍ ?\\\\my-coffee-app-pwa\\\\my-coffee-app-web\\\\firestore.rules\"],\"optionalArgs\":[\"port\",\"webchannel_port\",\"host\",\"rules\",\"functions_emulator\",\"seed_from_export\"],\"joinArgs\":false}"}}
[info] i  firestore: Firestore Emulator logging to firestore-debug.log {"Metadata":{"emulator":{"name":"firestore"},"message":"Firestore Emulator logging to \u001b[1mfirestore-debug.log\u001b[22m"}}
[warn] !  firestore: Fatal error occurred: 
   Firestore Emulator has exited with code: 1,stopping all running emulators {"Metadata":{"emulator":{"name":"firestore"},"message":"Fatal error occurred: \n   Firestore Emulator has exited with code: 1,\n   stopping all running emulators"}}
[info] i  firestore: Stopping Firestore Emulator {"Metadata":{"emulator":{"name":"firestore"},"message":"Stopping Firestore Emulator"}}
[debug] [2021-04-04T09:06:52.112Z] Firestore Emulator: Unable to terminate process (PID=16940) {"Metadata":{"emulator":{"name":"firestore"},"message":"Firestore Emulator: Unable to terminate process (PID=16940)"}}
[warn] !  firestore: Error stopping Firestore Emulator {"Metadata":{"emulator":{"name":"firestore"},"message":"Error stopping Firestore Emulator"}}
[info] i  hub: Stopping emulator hub {"Metadata":{"emulator":{"name":"hub"},"message":"Stopping emulator hub"}}

我的 package.json

{
  "name": "my-coffee-app","version": "0.0.0","scripts": {
    "ng": "ng","start": "ng serve","build": "ng build","test": "ng test","lint": "ng lint","e2e": "ng e2e"
  },"private": true,"dependencies": {
    "@angular/animations": "~11.2.5","@angular/cdk": "11.2.5","@angular/common": "~11.2.5","@angular/compiler": "~11.2.5","@angular/core": "~11.2.5","@angular/fire": "^6.1.4","@angular/forms": "~11.2.5","@angular/material": "11.2.5","@angular/platform-browser": "~11.2.5","@angular/platform-browser-dynamic": "~11.2.5","@angular/router": "~11.2.5","@angular/service-worker": "^11.2.5","@ngx-formly/core": "^5.0.0","@ngx-formly/material": "^5.0.0","@ngx-formly/schematics": "^5.10.15","bootstrap": "^5.0.0-beta3","firebase": "^8.3.2","material-theme-creator": "^3.0.7","rxjs": "~6.6.0","tslib": "^2.0.0","zone.js": "~0.11.3"
  },"devDependencies": {
    "@angular-devkit/architect": ">= 0.900 < 0.1200","@angular-devkit/build-angular": "~0.1102.3","@angular/cli": "~11.2.4","@angular/compiler-cli": "~11.2.5","@types/jasmine": "~3.6.0","@types/node": "^12.11.1","codelyzer": "^6.0.0","firebase-tools": "^9.8.0","fuzzy": "^0.1.3","inquirer": "^6.2.2","inquirer-autocomplete-prompt": "^1.0.1","jasmine-core": "~3.6.0","jasmine-spec-reporter": "~5.0.0","karma": "~6.1.0","karma-chrome-launcher": "~3.1.0","karma-coverage": "~2.0.3","karma-jasmine": "~4.0.0","karma-jasmine-html-reporter": "^1.5.0","open": "^7.0.3","protractor": "~7.0.0","ts-node": "~8.3.0","tslint": "~6.1.0","typescript": "~4.1.5"
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

关于如何避免使用缓存进行不必要的Firestore读取如何避免缓存中断的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Firebase Firestore onSnapshot 在使用 Firestore FieldValue for Timestamp 时为空、Firebase Firestore如何读取计数?、firebase 实时数据库下载定价与 Firestore 读取、Firestore 错误 - firebase:emulator:start - Firestore 模拟器已退出,代码:1等相关知识的信息别忘了在本站进行查找喔。

本文标签: