Firestore:仅当有更新时才从服务器获取数据,否则从缓存中获取

Posted

技术标签:

【中文标题】Firestore:仅当有更新时才从服务器获取数据,否则从缓存中获取【英文标题】:Firestore: Fetch data from server only if there is an update else fetch from cache 【发布时间】:2020-04-25 08:31:25 【问题描述】:

我开始使用 Firebase Firestore 数据库来利用我的锁定时间。我创建了一个应用程序,其中在 Firestore 中有一些主数据存储和一些事务数据。现在对于主数据,我目前是这样获取的

firestoreInstance.collection("makes-models")
            .whereEqualTo("type", "2W")
            .get()
            .addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 
                    makesListMutableLiveData.setValue(null);
                    Log.e(TAG, e.getMessage());
                
            ).addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) 
                    if(task.isSuccessful()) 
                        List<Make> makes = task.getResult().toObjects(Make.class);
                        makesListMutableLiveData.setValue(makes);
                     else 
                        makesListMutableLiveData.setValue(null);
                        Log.e(TAG, task.getException().getMessage());
                    
                
            );

现在我想要的是,如果有任何类型的修改,我应该只从服务器获取数据,否则只能从 CACHE 获取数据。根据文档,我读到,有一些方法可以获取

    仅来自缓存 仅来自服务器 检查服务器,如果由于网络问题无法连接,请从本地获取。

我想要的是:

以某种方式知道后端数据是否有更新,如果是,则从服务器获取,否则,从本地获取。我想到的一件事是使用自上次获取以来从服务器检查时间戳并相应地工作,但这似乎开销太大,我假设必须有更好的方法。

【问题讨论】:

这可能会帮助你firebase.google.com/docs/firestore/query-data/listen#java 【参考方案1】:

当您进行get() 调用时,Firestore SDK 将始终尝试从服务器获取数据,无论数据是否更改。仅当设备离线时,您才能从缓存中获取数据。但是,如果您尝试实时监听变化,根据官方文档:

初始状态可以直接来自服务器,也可以来自本地缓存。如果本地缓存中有可用的状态,查询快照将首先填充缓存数据,然后在客户端赶上服务器状态时使用服务器数据进行更新。

换句话说,如果服务器说您没有新添加/更新/删除的文档,则您从缓存中获取数据。但是,关于the duration of time you can get the data from cache,您还应该注意其他一些事情:

此外,如果侦听器断开连接的时间超过 30 分钟(例如,如果用户下线),您将被收取读取费用,就像您发出了全新的查询一样。

Another possible charge might also come from:

对于您执行的每个查询,即使查询未返回任何结果,也需要读取一个文档的最低费用。

但是根据 Firestore 的设计,所有这些费用都是正常的。

我还写了一篇你可能感兴趣的文章:

https://medium.com/firebase-tips-tricks/how-to-drastically-reduce-the-number-of-reads-when-no-documents-are-changed-in-firestore-8760e2f25e9e

【讨论】:

确实很有帮助 @KingOfTheJungle 谢谢。我想你也可能对这个article感兴趣。 嗨桑迪普!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑采纳(✔️)。我真的很感激。谢谢!【参考方案2】:

Firestore 中没有条件 get()。您概述的三个案例是唯一支持的案例。如果您想知道查询结果是否会从服务器更改,您实际上需要查询服务器,并支付该查询的全部费用。

一些可行的替代方案是:

让服务器使用某种推送通知通知客户端任何可能已更改的数据。服务器必须知道客户端对哪些文档感兴趣,客户端只需根据需要获取这些文档。

创建另一个文档,保存感兴趣的集合中文档的最后更新时间。客户可以检查一个文档以查看是否有更改,然后决定如何查询它们。

最重要的是,您将不得不发明一种方法来向客户端指示它是否应该在任何给定时刻查询缓存或服务器。

【讨论】:

以上是关于Firestore:仅当有更新时才从服务器获取数据,否则从缓存中获取的主要内容,如果未能解决你的问题,请参考以下文章

仅当记录匹配时才从另一个表中更新记录

仅当两个表中都存在员工时才从临时表中更新员工 ID

仅当锚标记包含 img 时才从图像中删除链接下划线

仅当 Firebase Firestore 中不存在文档时才创建文档

仅当有数据时才呈现表

Play Framework,Scala - 仅当有新数据可用时才向客户端发送 websocket 消息