当随机获得10个用户时,如何优化实时数据库调用?实时、数据库、用户

由网友(遇见她ㄣ心跳)分享简介:我读到了这个:How to optimize Firebase Realtime Database calls to improve performance?据说为了优化性能,我们必须复制数据。因此,我在数据库中创建了一个名为users的节来保存所有用户对象:usersuid-- name: "john"-- ema...

我读到了这个:

How to optimize Firebase Realtime Database calls to improve performance?

据说为了优化性能,我们必须复制数据。因此,我在数据库中创建了一个名为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()扩展函数,我们将等待所有用户并行加载。

阅读全文

相关推荐

最新文章