Có một tính năng cơ bản của redis MULTI / EXEC đơn vị có nghĩa là bạn không thể nhận được kết quả trong quá trình hoạt động. Do đó, có hai cách phổ biến để thực hiện những gì bạn yêu cầu:
- Sử dụng Lua (
ScriptEvaluate[Async]
); một tập lệnh Lua thực thi trên máy chủ từ đầu đến cuối, hiệu quả và tránh tất cả các vấn đề liên quan đến thời gian khứ hồi (độ trễ hoặc băng thông) hoặc sự cạnh tranh từ các kết nối khác - Sử dụng vòng lặp lạc quan đọc giá trị hiện tại, sau đó tạo giao dịch trong SE-Redis có thêm ràng buộc rằng giá trị bạn vừa đọc là giống nhau và thực hiện các tác dụng phụ bên trong giao dịch; thư viện sẽ phối hợp máy móc XEM vv cần thiết để làm cho điều này trở nên mạnh mẽ, nhưng nếu điều kiện ràng buộc trở nên không hợp lệ (tức là thư viện trả về
false
), bạn cần phải làm lại mọi thứ từ đầu
Thành thật mà nói, những ngày này tôi luôn hướng dẫn mọi người đến phương án 1; tùy chọn 2 chỉ "hấp dẫn" (và tôi sử dụng thuật ngữ đó khá sai) nếu không có tập lệnh Lua phía máy chủ.
Tôi không sử dụng PC, nhưng tôi đoán tập lệnh sẽ giống như sau:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id