Dit problem er, at du forsøger at køre flere kommandoer samtidigt med en enkelt redis-forbindelse.
Du forventer noget lignende
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
Resultaterne kommer tilbage i samme rækkefølge, men der er intet, der forbinder en tråd eller kommando til et specifikt resultat. Individuelle redis-forbindelser er ikke gevindsikre - du skal bruge en for hver arbejdstråd.
Du kan også se lignende problemer, hvis du bruger pipelining uhensigtsmæssigt - det er designet til kun at skrive scenarier som f.eks. at tilføje masser af elementer til en liste, hvor du kan forbedre ydeevnen ved at antage, at LPUSH lykkedes i stedet for at vente på, at serveren fortæller dig, at det lykkedes efter hver vare. Redis vil stadig returnere resultaterne, men de vil ikke nødvendigvis være resultater fra den sidst sendte kommando.
Bortset fra det er den grundlæggende tilgang rimelig. Der er dog et par forbedringer, du kan lave:
- I stedet for at tjekke længden, brug bare ikke-blokerende LPOP - hvis det returnerer null, er listen tom
- Tilføj en timer, så hvis listen er tom, vil den vente i stedet for blot at udstede en anden kommando.
- Inkluder en annulleringskontrol i while-løkketilstanden
- Håndter forbindelsesfejl - jeg bruger en ydre sløjfe, der er sat op, så hvis forbindelsen mislykkes, vil arbejderen forsøge at oprette forbindelse igen (grundlæggende genstart main ) i et rimeligt antal forsøg, før du afslutter arbejdsprocessen helt.