Redis
 sql >> Database >  >> NoSQL >> Redis

Python e Redis:best practice per le applicazioni Manager/Worker

Il tuo problema è che stai tentando di eseguire più comandi contemporaneamente con una singola connessione redis.

Ti aspetti qualcosa come

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

ma stai ricevendo

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

I risultati ritornano nello stesso ordine, ma non c'è nulla che colleghi un thread o un comando a un risultato specifico. Le singole connessioni redis non sono thread-safe:te ne servirà una per ogni thread di lavoro.

Puoi anche vedere problemi simili se usi il pipelining in modo inappropriato:è progettato per scrivere solo scenari come l'aggiunta di molti elementi a un elenco, in cui puoi migliorare le prestazioni supponendo che LPUSH abbia avuto successo piuttosto che aspettare che il server ti dica che è riuscito dopo ogni elemento. Redis restituirà comunque i risultati, ma non saranno necessariamente i risultati dell'ultimo comando inviato.

A parte questo, l'approccio di base è ragionevole. Ci sono un paio di miglioramenti che potresti apportare:

  • Invece di controllare la lunghezza, usa semplicemente LPOP non bloccante - se restituisce null, l'elenco è vuoto
  • Aggiungi un timer in modo che se l'elenco è vuoto, attenda piuttosto che emettere un altro comando.
  • Includi un controllo di annullamento nella condizione del ciclo while
  • Gestire gli errori di connessione:utilizzo un loop esterno impostato in modo che, se la connessione non riesce, il lavoratore tenterà di riconnettersi (in pratica riavviare main ) per un numero ragionevole di tentativi prima di terminare del tutto il processo lavorativo.