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.