Váš problém je, že se pokoušíte spouštět více příkazů současně s jedním připojením redis.
Čekáte něco jako
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
ale dostáváte
Thread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
Výsledky se vrátí ve stejném pořadí, ale neexistuje nic, co by spojovalo vlákno nebo příkaz s konkrétním výsledkem. Jednotlivá připojení redis nejsou bezpečná pro vlákna – budete potřebovat jedno pro každé pracovní vlákno.
Podobné problémy můžete zaznamenat také při nevhodném použití zřetězení – je navrženo pro scénáře pouze pro zápis, jako je přidávání spousty položek do seznamu, kde můžete zlepšit výkon tím, že předpokládáte, že LPUSH uspěl, místo abyste čekali, až vám server řekne, že bylo úspěšné po každém položka. Redis stále vrátí výsledky, ale nemusí to být nutně výsledky z posledního odeslaného příkazu.
Kromě toho je základní přístup rozumný. Existuje však několik vylepšení, která byste mohli provést:
- Místo kontroly délky použijte neblokující protokol LPOP – pokud vrátí hodnotu null, seznam je prázdný
- Přidejte časovač, aby pokud je seznam prázdný, počkal a nevydával další příkaz.
- Zahrnout kontrolu zrušení do podmínky cyklu while
- Ošetřovat chyby připojení – používám vnější smyčku nastavenou tak, že pokud se připojení nezdaří, pracovník se pokusí znovu připojit (v podstatě restartovat hlavní ) na přiměřený počet pokusů před úplným ukončením pracovního procesu.