Twój problem polega na tym, że próbujesz uruchomić wiele poleceń jednocześnie z jednym połączeniem redis.
Oczekujesz czegoś takiego jak
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
ale dostajesz
Thread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
Wyniki są zwracane w tej samej kolejności, ale nic nie łączy wątku lub polecenia z konkretnym wynikiem. Poszczególne połączenia redis nie są bezpieczne dla wątków — będziesz potrzebować jednego dla każdego wątku roboczego.
Możesz również zobaczyć podobne problemy, jeśli używasz nieodpowiedniego potokowania — jest ono przeznaczone do scenariuszy tylko do zapisu, takich jak dodawanie wielu elementów do listy, gdzie możesz poprawić wydajność, zakładając, że LPUSH się powiódł, zamiast czekać, aż serwer powie Ci, że się udało po każdym przedmiot. Redis nadal zwróci wyniki, ale niekoniecznie będą to wyniki ostatniego wysłanego polecenia.
Poza tym podstawowe podejście jest rozsądne. Istnieje jednak kilka ulepszeń, które możesz wprowadzić:
- Zamiast sprawdzać długość, po prostu użyj nieblokującego LPOP - jeśli zwróci wartość null, lista jest pusta
- Dodaj zegar, aby jeśli lista jest pusta, będzie czekać, a nie tylko wydawać kolejne polecenie.
- Dołącz sprawdzanie anulowania w warunku pętli while
- Obsługuj błędy połączenia — używam zewnętrznej pętli skonfigurowanej tak, że jeśli połączenie się nie powiedzie, pracownik spróbuje połączyć się ponownie (zasadniczo zrestartuj główny ) na rozsądną liczbę prób przed całkowitym zakończeniem procesu roboczego.