Вашият проблем е, че се опитвате да изпълнявате няколко команди едновременно с една връзка с redis.
Очаквате нещо като
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
но получавате
Thread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
Резултатите се връщат в същия ред, но няма нищо, свързващо нишка или команда с конкретен резултат. Отделните връзки на redis не са нишки безопасни - ще ви трябва по една за всяка работна нишка.
Можете също да видите подобни проблеми, ако използвате тръбопровода неподходящо – той е предназначен само за записване на сценарии като добавяне на много елементи към списък, където можете да подобрите производителността, като приемете, че LPUSH е успял, вместо да чакате сървърът да ви каже, че е успешен след всеки вещ. Redis пак ще върне резултатите, но те не са непременно резултати от последната изпратена команда.
Освен това основният подход е разумен. Има обаче няколко подобрения, които можете да направите:
- Вместо да проверявате дължината, просто използвайте неблокиращ LPOP – ако върне null, списъкът е празен
- Добавете таймер, така че ако списъкът е празен да изчака, а не просто да издава друга команда.
- Включете проверка за анулиране в условието на цикъла while
- Обработвайте грешки при свързване – използвам външен цикъл, настроен така, че ако връзката не успее, работникът ще се опита да се свърже отново (по същество рестартирайте главната ) за разумен брой опити, преди напълно да прекрати работния процес.