Lua script trong Redis chạy atomic — cả script không thể bị command khác chen ngang, đây là điểm mạnh so với MULTI/EXEC.
Gọi bằng EVAL script numkeys key [key ...] arg [arg ...], hoặc EVALSHA với SHA của script đã load để khỏi gửi lại phần thân script.
lua
-- rate limiter: tăng counter và đặt TTL trong cùng một thao tác atomic
local current = redis.call('INCR', KEYS[1])
if current == 1 then
redis.call('EXPIRE', KEYS[1], ARGV[1])
end
return currentUse case điển hình: rate limiting (đọc counter, kiểm tra ngưỡng, tăng, set TTL cùng lúc); distributed lock (check và set lock atomic); các cập nhật có điều kiện phức tạp mà một lệnh Redis không làm nổi.
Lưu ý: script chạy là block toàn bộ Redis nên phải viết thật ngắn; dùng SCRIPT LOAD để nạp trước rồi gọi qua EVALSHA cho nhẹ đường truyền.