Lý do WATCH
không được hiển thị trực tiếp là do SE.Redis được thiết kế như thế nào để ghép các lệnh từ các ngăn xếp lệnh gọi khác nhau trên một kết nối. Điều này làm cho bất kỳ công việc giao dịch nào cũng cần phải rất được quản lý chặt chẽ.
Tôi không rõ mục đích của việc "không thay đổi" sẽ là gì tự nó , mà không so sánh với một số giá trị đã biết - nếu không, bạn chỉ đang tạo một điều kiện đua. Chắc chắn sẽ có thể thêm hỗ trợ cho nó, nhưng tôi thực sự muốn hiểu trường hợp sử dụng dự kiến trước. Bạn có thể giải thích không?
Lại chỉnh sửa của bạn; ví dụ ưa thích của bạn (ví dụ cuối cùng) đơn giản là không thể thực hiện được với redis - không liên quan gì đến SE.Redis; nếu bạn thực hiện GET
bên trong một MULTI
, bạn không nhận được câu trả lời cho đến khi EXEC
hoàn thành - vì vậy bạn không thể sử dụng giá trị trong SET
: nó chưa có sẵn .
Nếu không phải để ghép kênh, bạn có thể sắp xếp lại ví dụ thứ hai của mình (dựa trên những gì SE.Redis thực hiện) một chút:
WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC
đây là điển hình sử dụng WATCH
:bạn xem những thứ bạn đang truy vấn trước, sau đó bạn biết rằng {key}
không thay đổi trong suốt vòng lặp này (hoặc ít nhất, giao dịch sẽ bị hủy bỏ; không có trạng thái không nhất quán). Tuy nhiên, WATCH
không hoạt động tốt với bộ ghép kênh , đó là lý do tại sao SE.Redis buộc bạn phải tìm nạp giá trị trước giao dịch , sau đó cho phép bạn so sánh giá trị để khẳng định rằng nó không thay đổi. Cùng một kết quả; cách tiếp cận hơi khác, nhưng nó là bộ ghép kênh an toàn. Để biết thêm về chủ đề đó, hãy xem tại đây.