sql >> Database >  >> NoSQL >> Redis

Python &Redis:best practices voor Manager/Worker-applicaties

Uw probleem is dat u meerdere opdrachten tegelijkertijd probeert uit te voeren met een enkele redis-verbinding.

Je verwacht zoiets als

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

maar je krijgt

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

De resultaten komen in dezelfde volgorde terug, maar er is niets dat een thread of commando aan een specifiek resultaat koppelt. Individuele redis-verbindingen zijn niet thread-safe - u hebt er een nodig voor elke worker-thread.

U kunt soortgelijke problemen ook zien als u pipelining op ongepaste wijze gebruikt - het is ontworpen voor alleen-schrijven scenario's zoals het toevoegen van veel items aan een lijst, waar u de prestaties kunt verbeteren door aan te nemen dat LPUSH is geslaagd in plaats van te wachten tot de server u vertelt dat het is gelukt na elke item. Redis zal nog steeds de resultaten retourneren, maar dit zijn niet noodzakelijk de resultaten van de laatst verzonden opdracht.

Afgezien daarvan is de basisbenadering redelijk. Er zijn echter een aantal verbeteringen die u zou kunnen aanbrengen:

  • Gebruik niet-blokkerende LPOP in plaats van de lengte te controleren - als het null retourneert, is de lijst leeg
  • Voeg een timer toe zodat als de lijst leeg is, deze wacht in plaats van gewoon een ander commando te geven.
  • Voeg een annuleringscontrole toe aan de while-lusvoorwaarde
  • Verhelp verbindingsfouten - ik gebruik een buitenste lus die is ingesteld zodat als de verbinding mislukt, de werknemer zal proberen opnieuw verbinding te maken (in feite herstart main ) voor een redelijk aantal pogingen voordat het werkproces helemaal wordt beëindigd.



  1. Redis Sentinels met TLS

  2. Mongo kan niet starten

  3. Selecteer records die overeenkomen met de concat-waarde van twee velden in mongodb

  4. Hoe mangoest Promise te gebruiken - mongo