Hvis du bruger Redis 2.6+, kan du gøre dette meget mere enkelt med Lua scripting-motoren. Redis-dokumentationen siger:
Et Redis-script er transaktionsbestemt per definition, så alt hvad du kan gøre med en Redis-transaktion, kan du også gøre med et script, og normalt vil scriptet være både enklere og hurtigere.
Det er trivielt at implementere det:
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
Brug:
lock("somejob") { do_exclusive_job }