获取 10 个随机用户时如何优化实时数据库调用?

How to optimize real-time database calls when getting 10 random users?

我读了这个:

据说为了优化性能我们必须复制数据。所以我在数据库中创建了一个名为 users 的部分来保存所有用户对象:

users
 \
  uid
   \
    -- name: "john"
   \
    -- email: "john@gmail.com"
   \
    -- age: 22

还有一个部分只包含用户的 uid:

uids
 \
  --- uid: true
 \
  --- uid: true

我有超过 1250 个用户。我需要的是 select 10 个随机用户并在 UI 中显示他们的数据。我通过读取 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() 扩展功能,我们将等待所有用户并行加载。