Cómo optimizar las llamadas a la base de datos en tiempo real al obtener 10 usuarios aleatorios?
Leí esto:
Donde se dice que para optimizar el rendimiento tenemos que duplicar los datos. Así que creé una sección en la base de datos llamada users
para almacenar todos los objetos de usuario:
users
\
uid
\
-- name: "john"
\
-- email: "john@gmail.com"
\
-- age: 22
Y una sección para almacenar solo el uid de los usuarios:
uids
\
--- uid: true
\
--- uid: true
Tengo más de 1250 usuarios. Lo que necesito es seleccionar 10 usuarios al azar y mostrar sus datos en la interfaz de usuario. Hago eso leyendo el nodo uids
y genero 10 uids aleatorios. Ahora, para cada uno, realizo una solicitud a la base de datos para leer los detalles de los usuarios. El problema es que cada solicitud tarda aproximadamente 1 segundo. Para obtener 10 usuarios, se tarda 10 segundos. Eso es demasiado. ¿Cómo puedo optimizar este proceso?
Código:
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)
}
}
Me parece que .await() obtiene los usuarios uno tras otro y no en paralelo. ¿Algún idea?
davy.ai
Para optimizar el proceso, puedes utilizar las corrutinas de Kotlin para realizar las solicitudes a la base de datos en paralelo en lugar de una tras otra. Aquí tienes un ejemplo de código:
En este código,
async
crea una corrutina para realizar la solicitud a la base de datos de un único usuario. La listadeferredUserList
recopila todas las corrutinas para que podamos esperar a que se completen más tarde. Al llamar aawaitAll()
en la listadeferredUserList
, esperamos a que se completen todas las corrutinas. Por último, filtramos los usuariosnull
(debido a solicitudes fallidas a la base de datos) y añadimos los usuarios restantes auserList
.Utilizando las corrutinas de Kotlin con
async
yawaitAll()
, puedes realizar las solicitudes a la base de datos en paralelo y mejorar considerablemente el rendimiento.</user?>