使用缓存或快照侦听器优化从Firestore服务器的读取次数

时间:2020-01-09 08:28:56

标签: firebase google-cloud-firestore

我正在使用Firebase渲染以下视图。因此,基本上,搜索由Firebase查询提供动力。

enter image description here

我正在使用以下代码:

Query query = FirebaseUtils.buildQuery(
        fireStore, 'customers', filters, lastDocument, documentLimit);
    print("query =" + query.toString());
    QuerySnapshot querySnapshot = await query.getDocuments();
    print("Got reply from firestore. No of items =" +  querySnapshot.documents.length.toString());

问题:

  1. 如果用户一次又一次命中相同的查询,它仍然命中服务器。我使用doc.metadata.isFromCache进行了检查,它始终返回false。

  2. 使用查询快照是否可以减少此搜索查询的读取次数?我觉得不是。随着用户一次又一次地更改查询。

  3. 还有其他限制读取次数的方法吗?

1 个答案:

答案 0 :(得分:1)

  1. 如果用户一次又一次命中相同的查询,它仍然命中服务器。我通过使用doc.metadata.isFromCache进行了检查,它始终返回false。

如果您在线,它将始终返回false,这是预期的行为,因为侦听器始终在服务器上寻找更改。如果您要在在线时强制从缓存中检索数据,则应通过向您的Source.CACHE调用中添加get()来将其明确指定给Firestore。如果您离线,它将始终返回true

  1. 使用查询快照是否有助于减少此搜索查询的读取次数?我觉得不是。当用户一次又一次地更改查询时。

不,不会。查询快照代表什么?它基本上是一个包含查询结果的对象。但是,如果您一次又一次地执行查询,只要它是相同的查询并且服务器上没有任何更改,那么您将承担任何读取操作的费用。发生这种情况是因为第二次执行查询时,结果来自缓存。如果您每次执行一次新搜索,将始终向您收取与您的查询返回的元素数相等的读取操作数。此外,如果您创建新搜索并且返回的元素已经在缓存中,那么您将仅对新搜索进行读操作。

  1. 还有其他限制读取次数的方法吗?

限制查询结果的最简单方法是使用limit()调用,并将要查询返回的元素数量作为参数传递:

limit(10)