Votre problème est que vous essayez d'exécuter plusieurs commandes simultanément avec une seule connexion redis.
Vous vous attendez à quelque chose comme
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
mais vous obtenez
Thread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
Les résultats reviennent dans le même ordre, mais rien ne relie un thread ou une commande à un résultat spécifique. Les connexions Redis individuelles ne sont pas thread-safe - vous en aurez besoin d'une pour chaque thread de travail.
Vous pouvez également voir des problèmes similaires si vous utilisez le pipelining de manière inappropriée - il est conçu pour des scénarios en écriture seule comme l'ajout de nombreux éléments à une liste, où vous pouvez améliorer les performances en supposant que LPUSH a réussi plutôt que d'attendre que le serveur vous dise qu'il a réussi après chaque Objet. Redis renverra toujours les résultats, mais ils ne seront pas nécessairement les résultats de la dernière commande envoyée.
En dehors de cela, l'approche de base est raisonnable. Cependant, vous pouvez apporter quelques améliorations :
- Plutôt que de vérifier la longueur, utilisez simplement LPOP non bloquant - s'il renvoie null, la liste est vide
- Ajoutez une minuterie pour que si la liste est vide, elle attendra plutôt que de simplement émettre une autre commande.
- Inclure une vérification d'annulation dans la condition de la boucle while
- Gérer les erreurs de connexion :j'utilise une boucle externe configurée de sorte que si la connexion échoue, le travailleur tente de se reconnecter (en gros, redémarrez main ) pour un nombre raisonnable de tentatives avant de terminer complètement le processus de travail.