Vấn đề của bạn là bạn đang cố gắng chạy nhiều lệnh đồng thời với một kết nối redis duy nhất.
Bạn đang mong đợi một cái gì đó giống như
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
nhưng bạn đang nhận được
Thread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
Các kết quả trả về theo cùng một thứ tự, nhưng không có gì liên kết một chuỗi hoặc lệnh với một kết quả cụ thể. Các kết nối redis riêng lẻ không an toàn cho luồng - bạn sẽ cần một kết nối cho mỗi luồng công nhân.
Bạn cũng có thể gặp các vấn đề tương tự nếu bạn sử dụng pipelining không phù hợp - nó được thiết kế để chỉ ghi các tình huống như thêm nhiều mục vào danh sách, nơi bạn có thể cải thiện hiệu suất bằng cách giả sử LPUSH đã thành công thay vì đợi máy chủ cho bạn biết nó đã thành công sau mỗi mục. Redis sẽ vẫn trả về kết quả, nhưng chúng không nhất thiết phải là kết quả từ lệnh cuối cùng được gửi.
Ngoài ra, cách tiếp cận cơ bản là hợp lý. Có một số cải tiến mà bạn có thể thực hiện:
- Thay vì kiểm tra độ dài, chỉ cần sử dụng LPOP không chặn - nếu nó trả về giá trị rỗng, danh sách sẽ trống
- Thêm bộ hẹn giờ để nếu danh sách trống, nó sẽ đợi thay vì chỉ đưa ra một lệnh khác.
- Bao gồm kiểm tra hủy trong điều kiện vòng lặp while
- Xử lý lỗi kết nối - Tôi sử dụng vòng lặp bên ngoài được thiết lập để nếu kết nối không thành công, nhân viên sẽ cố gắng kết nối lại (về cơ bản khởi động lại main ) cho một số lần thử hợp lý trước khi chấm dứt hoàn toàn quy trình worker.