sql >> Databasteknik >  >> NoSQL >> Redis

Python &Redis:Bästa tillvägagångssätt för Manager/Worker-applikationer

Ditt problem är att du försöker köra flera kommandon samtidigt med en enda redis-anslutning.

Du förväntar dig något liknande

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

men du får

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

Resultaten kommer tillbaka i samma ordning, men det finns inget som länkar en tråd eller ett kommando till ett specifikt resultat. Individuella redis-anslutningar är inte gängsäkra - du behöver en för varje arbetsgänga.

Du kan också se liknande problem om du använder pipelining på ett olämpligt sätt - den är designad för skrivbara scenarier som att lägga till massor av objekt till en lista, där du kan förbättra prestandan genom att anta att LPUSH lyckades istället för att vänta på att servern ska berätta för dig att det lyckades efter varje Artikel. Redis kommer fortfarande att returnera resultaten, men de kommer inte nödvändigtvis att vara resultat från det senaste kommandot som skickades.

Utöver det är det grundläggande tillvägagångssättet rimligt. Det finns dock ett par förbättringar du kan göra:

  • Istället för att kontrollera längden, använd bara icke-blockerande LPOP - om den returnerar null är listan tom
  • Lägg till en timer så att om listan är tom kommer den att vänta istället för att bara ge ett nytt kommando.
  • Inkludera en avbokningskontroll i while-slingan
  • Hantera anslutningsfel - jag använder en yttre slinga som är inställd så att om anslutningen misslyckas kommer arbetaren att försöka återansluta (starta om main i princip ) för ett rimligt antal försök innan arbetsprocessen helt avslutas.



  1. Hur säkerställer man unika objekt i en array baserat på specifika fält - mongoDB?

  2. MongoDB frågar optimering

  3. Ansluter MongoDB till Ruby med självsignerade certifikat för SSL

  4. SQL NULLIF() Förklarat