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