es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    val deferredUserList = ArrayList<><user?>>()
    while (userList.size < 10) {
        val randomId = Random.nextInt(userIdsList.size)
        val randomUserDeferred = async {
            usersRef.child(questionIdsList[randomId]).get().await().getValue(User::class.java)
        }
        deferredUserList.add(randomUserDeferred)
    }
    val randomUserList = deferredUserList.awaitAll().filterNotNull()
    userList.addAll(randomUserList)
    

    En este código, async crea una corrutina para realizar la solicitud a la base de datos de un único usuario. La lista deferredUserList recopila todas las corrutinas para que podamos esperar a que se completen más tarde. Al llamar a awaitAll() en la lista deferredUserList, esperamos a que se completen todas las corrutinas. Por último, filtramos los usuarios null (debido a solicitudes fallidas a la base de datos) y añadimos los usuarios restantes a userList.

    Utilizando las corrutinas de Kotlin con async y awaitAll(), puedes realizar las solicitudes a la base de datos en paralelo y mejorar considerablemente el rendimiento.</user?>

Comments are closed.