Nếu bạn đang sử dụng Redis 2.6+, bạn có thể thực hiện việc này đơn giản hơn nhiều với công cụ tạo kịch bản Lua. Tài liệu của Redis cho biết:
Tập lệnh Redis là giao dịch theo định nghĩa, vì vậy mọi thứ bạn có thể làm với giao dịch Redis, bạn cũng có thể làm với một tập lệnh và thường thì tập lệnh sẽ đơn giản hơn và nhanh hơn.
Việc triển khai nó rất đơn giản:
LUA_ACQUIRE = "return redis.call('setnx', KEYS[1], 1) == 1 and redis.call('expire', KEYS[1], KEYS[2]) and 1 or 0"
def lock(key, timeout = 3600)
if redis.eval(LUA_ACQUIRE, key, timeout) == 1
begin
yield
ensure
r.del key
end
end
end
Cách sử dụng:
lock("somejob") { do_exclusive_job }