Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Python &Redis:Best Practices für Manager/Worker-Anwendungen

Ihr Problem ist, dass Sie versuchen, mehrere Befehle gleichzeitig mit einer einzigen Redis-Verbindung auszuführen.

Sie erwarten so etwas wie

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

aber Sie bekommen

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

Die Ergebnisse kommen in der gleichen Reihenfolge zurück, aber es gibt nichts, was einen Thread oder Befehl mit einem bestimmten Ergebnis verknüpft. Einzelne Redis-Verbindungen sind nicht Thread-sicher – Sie benötigen eine für jeden Worker-Thread.

Sie können auch ähnliche Probleme sehen, wenn Sie Pipelining unangemessen verwenden – es ist für reine Schreibszenarien wie das Hinzufügen vieler Elemente zu einer Liste konzipiert, in denen Sie die Leistung verbessern können, indem Sie davon ausgehen, dass LPUSH erfolgreich war, anstatt darauf zu warten, dass der Server Ihnen nach jedem Vorgang mitteilt, dass es erfolgreich war Artikel. Redis gibt weiterhin die Ergebnisse zurück, aber es handelt sich nicht unbedingt um Ergebnisse des letzten gesendeten Befehls.

Ansonsten ist der grundsätzliche Ansatz sinnvoll. Es gibt jedoch ein paar Verbesserungen, die Sie vornehmen könnten:

  • Anstatt die Länge zu überprüfen, verwenden Sie einfach nicht blockierendes LPOP - wenn es null zurückgibt, ist die Liste leer
  • Fügen Sie einen Timer hinzu, damit die Liste wartet, wenn sie leer ist, anstatt nur einen weiteren Befehl auszugeben.
  • Fügen Sie eine Abbruchprüfung in die Bedingung der While-Schleife ein
  • Verbindungsfehler behandeln - Ich verwende eine äußere Schleife, die so eingerichtet ist, dass der Worker versucht, die Verbindung wiederherzustellen, wenn die Verbindung fehlschlägt (im Grunde starten Sie main neu ) für eine angemessene Anzahl von Versuchen, bevor der Arbeitsprozess vollständig beendet wird.