sql >> Base de Datos >  >> NoSQL >> Redis

Python y Redis:mejores prácticas de aplicaciones de administrador/trabajador

Su problema es que está intentando ejecutar varios comandos al mismo tiempo con una sola conexión redis.

Estás esperando algo como

Thread 1     Thread 2
LLEN test    
1                            
LPOP test   
command      
             LLEN test
             0

pero estás recibiendo

Thread 1     Thread 2
LLEN test    
1                            
LPOP test   
             LLEN test
             command
0

Los resultados regresan en el mismo orden, pero no hay nada que vincule un hilo o comando a un resultado específico. Las conexiones redis individuales no son seguras para subprocesos:necesitará una para cada subproceso de trabajo.

También puede ver problemas similares si usa la canalización de manera inapropiada:está diseñado para escenarios de solo escritura, como agregar muchos elementos a una lista, donde puede mejorar el rendimiento asumiendo que LPUSH tuvo éxito en lugar de esperar a que el servidor le diga que tuvo éxito después de cada uno. ít. Redis aún devolverá los resultados, pero no necesariamente serán los resultados del último comando enviado.

Aparte de eso, el enfoque básico es razonable. Sin embargo, hay un par de mejoras que podrías hacer:

  • En lugar de verificar la longitud, simplemente use LPOP sin bloqueo; si devuelve nulo, la lista está vacía
  • Agregue un temporizador para que, si la lista está vacía, espere en lugar de simplemente emitir otro comando.
  • Incluya una verificación de cancelación en la condición del ciclo while
  • Manejar errores de conexión:utilizo una configuración de bucle externo para que, si falla la conexión, el trabajador intente volver a conectarse (básicamente reinicie main ) durante un número razonable de intentos antes de finalizar el proceso de trabajo por completo.