आप नहीं कर सकते, क्योंकि सभी आदेश (प्राप्त करने सहित) वास्तव में निष्पादन समय पर निष्पादित होते हैं। इस स्थिति में, प्राप्त कमांड केवल भविष्य की वस्तु देता है, वास्तविक मूल्य नहीं।
इस तरह के लेन-देन को लागू करने के दो तरीके हैं।
वॉच क्लॉज का उपयोग करना
वॉच क्लॉज का उपयोग समवर्ती अपडेट से बचाने के लिए किया जाता है। यदि वॉच और मल्टी क्लॉज के बीच वेरिएबल का मान अपडेट किया जाता है, तो मल्टी ब्लॉक में कमांड लागू नहीं होते हैं। लेन-देन का दूसरी बार प्रयास करना ग्राहक पर निर्भर है।
loop do
$redis.watch "foo"
val = $redis.get("foo")
if val == "bar" then
res = $redis.multi do |r|
r.set("foo", "baz")
end
break if res
else
$redis.unwatch "foo"
break
end
end
यहां स्क्रिप्ट थोड़ी जटिल है क्योंकि ब्लॉक की सामग्री खाली हो सकती है, इसलिए यह जानने का कोई आसान तरीका नहीं है कि क्या लेनदेन रद्द कर दिया गया है, या यह बिल्कुल भी नहीं हुआ है। यह आम तौर पर तब आसान होता है जब लेन-देन रद्द होने को छोड़कर सभी मामलों में मल्टी ब्लॉक रिटर्न परिणाम देता है।
लुआ सर्वर-साइड स्क्रिप्टिंग का उपयोग करना
Redis 2.6 या बेहतर के साथ, Lua स्क्रिप्ट को सर्वर पर निष्पादित किया जा सकता है। पूरी लिपि का निष्पादन परमाणु है। इसे रूबी में आसानी से लागू किया जा सकता है:
cmd = <<EOF
if redis.call('get',KEYS[1]) == ARGV[1] then
redis.call('set',KEYS[1],ARGV[2] )
end
EOF
$redis.eval cmd, 1, "foo", "bar", "baz"
यह आमतौर पर वॉच क्लॉज का उपयोग करने की तुलना में बहुत आसान है।