由网友(遇见她ㄣ心跳)分享简介:我读到了这个:How to optimize Firebase Realtime Database calls to improve performance?据说为了优化性能,我们必须复制数据。因此,我在数据库中创建了一个名为users的节来保存所有用户对象:usersuid-- name: "john"-- ema...![阿里在数据库智能优化路上,做了哪些探索与实践](https://p.xsw88.cn/allimgs/daicuo/20230903/2788.png)
我读到了这个:
How to optimize Firebase Realtime Database calls to improve performance?据说为了优化性能,我们必须复制数据。因此,我在数据库中创建了一个名为users
的节来保存所有用户对象:
users
uid
-- name: "john"
-- email: "john@gmail.com"
-- age: 22
![阿里在数据库智能优化路上,做了哪些探索与实践](https://p.xsw88.cn/allimgs/daicuo/20230903/2788.png)
和一个仅保存用户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()
扩展函数,我们将等待所有用户并行加载。
相关推荐
最新文章