Jika Anda menggunakan Redis 2.6+, Anda dapat melakukannya dengan lebih sederhana dengan mesin skrip Lua. Dokumentasi Redis mengatakan:
Skrip Redis adalah transaksional menurut definisinya, jadi semua yang dapat Anda lakukan dengan transaksi Redis, Anda juga dapat melakukannya dengan skrip, dan biasanya skrip akan lebih sederhana dan lebih cepat.
Menerapkannya sepele:
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
Penggunaan:
lock("somejob") { do_exclusive_job }