यदि आप रेडिस 2.6+ का उपयोग कर रहे हैं, तो आप लुआ स्क्रिप्टिंग इंजन के साथ इसे और अधिक सरलता से कर सकते हैं। रेडिस दस्तावेज कहता है:
<ब्लॉकक्वॉट>एक रेडिस स्क्रिप्ट परिभाषा के अनुसार लेनदेन संबंधी है, इसलिए रेडिस लेनदेन के साथ आप जो कुछ भी कर सकते हैं, आप एक स्क्रिप्ट के साथ भी कर सकते हैं, और आमतौर पर स्क्रिप्ट सरल और तेज दोनों होगी।
इसे लागू करना मामूली है:
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
उपयोग:
lock("somejob") { do_exclusive_job }