Bạn sẽ ổn về mặt nguyên tử theo tài liệu của Redis:
Redis sử dụng cùng một trình thông dịch Lua để chạy tất cả các lệnh. Ngoài ra Redis đảm bảo rằng một tập lệnh được thực thi theo cách nguyên tử:không có tập lệnh nào khác hoặc lệnh Redis sẽ được thực thi trong khi một tập lệnh đang được thực thi. Ngữ nghĩa này tương tự như ngữ nghĩa của MULTI / EXEC. Từ quan điểm của tất cả các khách hàng khác, các hiệu ứng của một tập lệnh vẫn chưa hiển thị hoặc đã hoàn thành.
Tuy nhiên, nếu tập lệnh quá chậm, nó sẽ gây ra vấn đề. Vì vậy, script là tốt nhất cho các hoạt động nhẹ đòi hỏi một số logic và tính nguyên tử.
Một sơ hở khác mà bạn có thể mắc phải là, nếu tập lệnh nào đó bị lỗi ở giữa chừng, thì những lệnh gọi bạn đã thực hiện sẽ không thể khôi phục lại được, mặc dù tập lệnh sẽ trả về lỗi.
Ví dụ:Bạn có một tập lệnh như sau:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
Việc thực thi tập lệnh sẽ trả về lỗi, nhưng foo
đã được đặt trong redis là 1
.
Điều gì đó không liên quan đến câu hỏi của bạn:Tôi nhận thấy rằng bạn đã sử dụng
eval "your_raw_code" key_count keys argv
thực sự bạn có thể gọi tệp script lua trong eval khi bạn ở trong terminal:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv