当随机获得10个用户时,如何优化实时数据库调用? [英] How to optimize real-time database calls when getting 10 random users?

查看:0
本文介绍了当随机获得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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆