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.

¿Existe una práctica común para recorrer Redis en bucle?

Estoy utilizando Redis como mi almacenamiento temporal, el cual lleno con claves hSet.
Necesito almacenar solo sesiones activas que hayan sido actualizadas hace menos de 10 minutos. Decidí recorrer todas las claves con un worker en segundo plano cada 10 minutos para insertar sesiones inactivas en mi base de datos principal de PostgreSQL y eliminarlas de Redis. Ya que sé que “EXPIRE” no funciona para mí, porque necesito guardar mis sesiones antes de borrarlas.

Estoy utilizando el paquete “redis” de Node y mi carga promedio a Redis es de aproximadamente 50 000 sesiones activas.
¿Es esta la única forma de resolver mi problema?

for await (const key of connection.scanIterator()) {
    const data = await connection.hGetAll(key);
    if (is10MinutesHasPast(data)) {
        // insertar datos en postgres
        await connection.delete(key)
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en node.js y redis, existen otras formas de resolver el problema de almacenar solo las sesiones activas que se actualizaron en los últimos 10 minutos. Un enfoque podría ser utilizar Redis Sorted Sets para almacenar las claves de sesión con una marca de tiempo como puntaje. Por ejemplo, podría utilizar un Redis Sorted Set para almacenar las sesiones activas y su marca de tiempo de última actualización de la siguiente manera:

    1. Cuando se crea o actualiza una sesión, agregue su clave al Redis Sorted Set con la marca de tiempo como puntaje:
    await connection.zadd('activeSessions', Date.now(), key);
    
    1. Para recuperar solo las sesiones activas, utilice el comando zrangebyscore del Redis Sorted Set para devolver todas las claves de sesión con una marca de tiempo que esté dentro de los últimos 10 minutos:
    const tenMinutesAgo = Date.now() - (10 * 60 * 1000);
    const activeSessionKeys = await connection.zrangebyscore('activeSessions', '-inf', tenMinutesAgo);
    
    1. Recorra las claves de sesión activas y recupere sus datos usando hGetAll:
    for await (const key of activeSessionKeys) {
        const data = await connection.hGetAll(key);
        // ...
    }
    
    1. Después de procesar las sesiones activas, elimínelas del Redis Sorted Set:
    await connection.zrem('activeSessions', ...activeSessionKeys);
    

    Utilizar un Redis Sorted Set le permite recuperar y procesar eficientemente solo las sesiones activas sin recorrer todas las claves y sin necesidad de escanear periódicamente la base de datos de Redis. Esto puede proporcionar un mejor rendimiento y escalabilidad, especialmente a medida que aumenta el número de sesiones.

Comments are closed.