当随机获得10个用户时,如何优化实时数据库调用? [英] How to optimize real-time database calls when getting 10 random users?
本文介绍了当随机获得10个用户时,如何优化实时数据库调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我读到了这个:
据说为了优化性能,我们必须复制数据。因此,我在数据库中创建了一个名为users
的节来保存所有用户对象:
users
uid
-- name: "john"
-- email: "john@gmail.com"
-- age: 22
和一个仅保存用户uid的节:
uids
--- uid: true
--- uid: true
我有超过1250个用户。我需要的是选择10个随机用户,并在用户界面中显示他们的数据。我通过读取uids
节点来实现这一点,并生成10个随机UID。现在,我为每个用户创建数据库请求,以读取用户的详细信息。问题是每个请求需要大约1秒的时间。要获得10个用户,需要10秒。太贵了。如何优化此流程?
编码:
while (userList.size < 10) {
val randomId = Random.nextInt(userIdsList.size)
val randomUser = usersRef.child(questionIdsList[randomId]).get().await().getValue(User::class.java)
if (!userList.contains(randomUser)) {
userList.add(randomUser)
}
}
在我看来,.aWait()会一个接一个地获得用户,而不是并行的。有什么想法吗?
推荐答案
您说得对,用户是一个接一个来的,而不是并行的。要实现并行性,您可以使用kotlinx-coroutines-play-services
库中的几个功能:
val tasks: MutableList<Deferred<DataSnapshot>> = mutableListOf()
for (i in 1..10) {
val randomId = Random.nextInt(i)
val deferredTask = usersRef.child(questionIdsList[randomId]).get().asDeferred()
tasks.add(deferredTask)
}
tasks.awaitAll().forEach { dataSnapshot ->
val randomUser = dataSnapshot.getValue(User::class.java)
if (!userList.contains(randomUser)) {
userList.add(randomUser)
}
}
使用asDeferred
扩展函数可以将Task
转换为Deferred
。
然后在Collection<Deferred<T>>
上使用awaitAll()
扩展函数,我们将等待所有用户并行加载。
这篇关于当随机获得10个用户时,如何优化实时数据库调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文