आप नहीं कर सकते, क्योंकि सभी आदेश (प्राप्त करने सहित) वास्तव में निष्पादन समय पर निष्पादित होते हैं। इस स्थिति में, प्राप्त आदेश केवल भविष्य की वस्तु देता है, वास्तविक मूल्य नहीं।
ऐसे लेनदेन को लागू करने के दो तरीके हैं।
एक घड़ी खंड
का उपयोग करते हुए घड़ी खंड समवर्ती अद्यतन के खिलाफ की रक्षा करने के लिए प्रयोग किया जाता है। यदि वैरिएबल का मान घड़ी और बहु खंड के बीच अद्यतन किया गया है, तो बहु ब्लॉक में कमांड लागू नहीं होते हैं। यह किसी अन्य समय लेनदेन का प्रयास करने के लिए ग्राहक पर निर्भर है।
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 या बेहतर के साथ, लुआ स्क्रिप्ट सर्वर पर क्रियान्वित किया जा सकता। पूरी लिपि का निष्पादन परमाणु है। यह आसानी से रूबी में लागू किया जा सकता:
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"
यह आमतौर पर बहुत वॉच खंड का उपयोग करने से आसान है।
स्रोत
2012-07-03 12:40:58
मुझे डर है कि आप ऐसा नहीं कर सकते हैं। –