問題は、単一の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接続はスレッドセーフではありません。ワーカースレッドごとに1つ必要になります。
パイプラインを不適切に使用した場合にも同様の問題が発生する可能性があります。これは、リストに多数のアイテムを追加するなどの書き込み専用シナリオ向けに設計されており、サーバーが成功したことを通知するのを待つのではなく、LPUSHが成功したと想定することでパフォーマンスを向上させることができます。アイテム。 Redisは引き続き結果を返しますが、必ずしも最後に送信されたコマンドの結果であるとは限りません。
それ以外は、基本的なアプローチは合理的です。ただし、いくつかの機能強化を行うことができます。
- 長さをチェックするのではなく、ノンブロッキングLPOPを使用してください-nullを返す場合、リストは空です
- タイマーを追加して、リストが空の場合に別のコマンドを発行するのではなく待機するようにします。
- whileループ条件にキャンセルチェックを含める
- 接続エラーの処理-接続が失敗した場合にワーカーが再接続を試みるように設定された外部ループを使用します(基本的にメインを再起動します) )ワーカープロセスを完全に終了する前に、妥当な回数試行します。