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.