Firestore调用.get查询未变更文档时,将从本地缓存还是服务器获取?
关于Firestore .get() 查询的本地缓存与服务器交互逻辑
嗨,我来帮你理清这个Firestore的查询逻辑,毕竟在Android上做用户数据查询是非常常见的场景~
首先直接给你核心结论:默认情况下,调用get()方法查询文档时,Firestore会优先尝试从服务器获取最新数据,但如果文档内容没有变更,服务器只会返回一个"未修改"的轻量响应(类似HTTP 304),不会重复下载整个文档数据,开销极小。
下面分场景给你拆解细节:
- 当设备在线时:
get()会先向服务器发起请求,服务器会对比本地缓存的文档版本标识和云端版本,如果两者一致,就返回304状态,Firestore随即直接用本地缓存的数据返回给你;如果版本不一致,才会下载最新文档并同步更新本地缓存。 - 当设备离线时:
get()会直接读取本地缓存的数据,不会尝试连接服务器。
如果你想彻底跳过服务器请求,完全使用本地缓存的数据(比如你确定文档不会有变更,或者想彻底避免任何服务器交互开销),可以在调用get()时指定数据源为Source.CACHE,代码示例如下:
// Kotlin示例 val userDocRef = FirebaseFirestore.getInstance().collection("users").document(currentUserId) userDocRef.get(Source.CACHE) .addOnSuccessListener { document -> // 处理本地缓存的用户数据 } .addOnFailureListener { exception -> // 缓存中没有该文档时会触发失败回调 }
另外补充个实用小提示:如果你需要实时监听文档变化,用addSnapshotListener()会更高效——它会自动同步本地缓存和服务器数据,第一次加载时优先用缓存,之后只有当文档真的有变更时才从服务器拉取,还能实时收到更新通知,比反复调用get()更符合事务性场景的需求。
内容的提问来源于stack exchange,提问作者LAX_DEV
相关产品推荐
相关产品推荐

