Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

मैं रूबी में एक बहु ब्लॉक के अंदर रेडिस से कैसे पढ़ सकता हूं?

आप नहीं कर सकते, क्योंकि सभी आदेश (प्राप्त करने सहित) वास्तव में निष्पादन समय पर निष्पादित होते हैं। इस स्थिति में, प्राप्त कमांड केवल भविष्य की वस्तु देता है, वास्तविक मूल्य नहीं।

इस तरह के लेन-देन को लागू करने के दो तरीके हैं।

वॉच क्लॉज का उपयोग करना

वॉच क्लॉज का उपयोग समवर्ती अपडेट से बचाने के लिए किया जाता है। यदि वॉच और मल्टी क्लॉज के बीच वेरिएबल का मान अपडेट किया जाता है, तो मल्टी ब्लॉक में कमांड लागू नहीं होते हैं। लेन-देन का दूसरी बार प्रयास करना ग्राहक पर निर्भर है।

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"

यह आमतौर पर वॉच क्लॉज का उपयोग करने की तुलना में बहुत आसान है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. काउचबेस बेंचमार्क बहुत धीमी INSERTs और GETs का खुलासा करता है (KeyValue संचालन का उपयोग करके); लगातार MySQL डेटा की तुलना में धीमा

  2. रेडिस कीज कमांड में 'OR' कंडीशन कैसे लागू करें

  3. ServiceStack.Net Redis:संबंधित ऑब्जेक्ट बनाम संबंधित ऑब्जेक्ट Id को संग्रहीत करना

  4. रेडिस और पायथन का उपयोग करके एक विशिष्ट प्राप्तकर्ता द्वारा उपभोग किए जाने वाले विफल-सुरक्षित संदेश प्रसारण

  5. जेएसओएन का प्रतिनिधित्व करने के लिए रेडिस स्ट्रिंग्स बनाम रेडिस हैश:दक्षता?