groups: {
group1: {
-MEt4K5xhsYL33anhXpP: {
fromUid: "diidssm......."
userImage: "https://firebasestorage..."
text: "hello"
date: 1617919946
emojis: {
"heart": 2
"like": 1
}
}
-MEt8BLP2yMEUMPbG2zV: {
...
}
-MF-Grpl8Jchxpbn2mxH: {
...
}
-MF-OUjWXsFh7lBPosMf: {
...
}
}
}
ref = Database.database().reference().child("groups").child("group1")
ref.queryLimited(toLast: 40).observe(.childAdded, with: { (snapshot) in
...
//add to messages array to load collection view
//for each message observe emojis and update emojis to reflect changes e.g. +1 like
ref.child("emojis").observe(.value, with: { (snapshot) in
...
})
})
ref.queryOrdered(byChild: "date").queryEnding(beforeValue: prevdate, childKey: messageId).queryLimited(toLast: 40).observeSingleEvent(of: .value, with: { (snapshot) in
我知道扇出技术用于每次同步获得更少的信息。如果我将监听器附加到groups/groupname/以获取该组所有消息的列表,我还将询问该节点下每个消息的所有信息。使用扇出方法,我还可以使用来自另一个节点的消息键,请求最近40条消息的消息信息,以及每次向上滚动的下40条消息的消息信息,如下所示。
allGroups: {
group1: {
-MEt4K5xhsYL33anhXpP: 1
-MEt8BLP2yMEUMPbG2zV: 1
-MF-Grpl8Jchxpbn2mxH: 1
-MF-OUjWXsFh7lBPosMf: 1
}
}
但是,如果我使用的是queryLimited(Tolast:40),扇出方法是否有益甚至必要?这难道不会解决“我也会询问该节点下每个消息的所有信息”的问题吗?
在检查新消息方面,我只使用上面第一段代码中的。ChildAdded进行检查(ref.queryLimited(tolast:40).observe(.ChildAdd))。根据下面的帖子,queryLimited(tolast:40)将同步最后40个子节点,并保持同步(在添加新节点时删除以前的节点)。
我假设如果group1有1000条消息,使用这种方法,我只读取我需要的40条最新消息和每个滚动的40条,因此忽略了其他几百条。我为什么要使用扇出技术呢?可能是我不明白关于有限查询的一些基本知识。
附带问题:我应该在每个消息节点下包括对配置文件图像的引用吗?就云存储和实时数据库存储而言,这样做不好吗?理想情况下,会有数百个群组聊天。
对这个问题有很多评论,所以我想我会把所有这些都浓缩成一个答案。
问题中“扇出技术”的目的是最大化查询性能。
在这个用例中,查询只返回最后40个结果
ref.queryLimited(toLast: 40)
let updatedUser = ["name": "Shannon", "username": "shannonrules"]
let ref = Firebase(url: "https://<YOUR-FIREBASE-APP>.firebaseio.com")
let fanoutObject = ["/users/1": updatedUser,
"/usersWhoAreCool/1": updatedUser,
"/usersToGiveFreeStuffTo/1", updatedUser]
ref.updateChildValues(updatedUser) // atomic updating goodness
在这个问题中,实际上没有任何数据要“扇出”,所以它不适用,因为没有尝试连接(从多个节点提取数据)或更新多个节点。
我建议的一个改变是将emoji的节点从消息节点中移除。
因此,每一个都有一个观察者,这导致了成千上万的观察者,这可能很难管理。我会为那些表情符号创建一个单独的高级节点
emojis
-MEt4K5xhsYL33anhXpP: //the message id
"heart": 2 //or however you want to store them
"like": 1
从功能上看,servlet 位于Common Gateway Interface(公共网关接口,简称 CGI)程序和私有的服务器扩展如 Netscape Server API(NSAPI)或 Apache Modules 这两者之间。 相对于其他服务器扩展机制 Servlet 有如下优势: 它们通常比 CGI 脚本更快,因为采用不同的处理模型。 它们采用标准的 API 从而支持更多的Web 服务器
连接效率比较 <?php $p_start_time = microtime(true); for ($i = 1; $i <= 100; $i++) { $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'aaaaaa'); } $p_end_time = microtime(true); $res = $p_end_
注意:本书中的 Service Mesh 章节已不再维护,请转到 istio-handbook 中浏览。 这一章主要讲解Service Mesh技术之间的区别,Service Mesh与其他相关技术之间的区别,读者可以直接浏览该网站来查看对比:http://layer5.io/service-meshes/ 为什么有了如Kubernetes这样的容器编排我们还需要Service Mesh呢,下表是
据说Java的默认序列化机制效率不高,因为a)它通过反射发现要写入/读取哪些字段,这通常很慢b)它将额外的数据写入流。 提高效率的一种方法是实现Externalizable及其writeExternal/readExternal方法。 问题是:如果我改为提供“writeObject/readObject”方法,并且不在其中调用deafiltWriteObject/defaultReadObject
问题内容: 我有一个可能包含数千个对象的模型。我想知道什么是最有效的方式来存储它们并在获得ID后检索单个对象。ID是长数字。 这些是我正在考虑的两个选项。在选项一中,它是一个带有递增索引的简单数组。在选项2中,如果有区别,它是一个关联数组,也可能是一个对象。我的问题是,当我主要需要检索单个对象时,有时又遍历它们并进行排序时,哪一个效率更高。 具有非关联数组的选项一: 选项2与关联数组: 更新: 好
等效分区是一种软件测试技术,其中输入数据被划分为有效值和无效值的分区,并且所有分区必须表现出相同的行为。如果一个分区的条件为真,则另一个等效分区的条件也必须为真,如果一个分区的条件为假,则另一个等效分区的条件也必须为假。等价划分的原则是,测试用例应设计为至少覆盖每个分区一次。每个等效分区的每个值必须表现出与其他分区相同的行为。 等效分区源自软件的要求和规范。这种方法的优点是,它有助于减少测试时间,