2012-04-14 17 views
22

से कई महत्वपूर्ण मान प्राप्त करना मैं वर्तमान में रेडिस के साथ खेल रहा हूं और मुझे कुछ प्रश्न हैं। क्या कुंजी की सरणी से मूल्य प्राप्त करना संभव है?रेडिस

उदाहरण:

users:1:name "daniel" 
users:1:age "24" 

users:2:name "user2" 
users:2:age "24" 

events:1:attendees "users:1", "users:2" 

जब मैं यह रिटर्न "users:1", "users:2"redis.get events:1:attendees। मैं इस सूची के माध्यम से लूप कर सकता हूं और उपयोगकर्ताओं को प्राप्त कर सकता हूं: 1, उपयोगकर्ताओं को प्राप्त करें: 2। लेकिन यह गलत लगता है, क्या सभी उपस्थित लोगों की जानकारी 1 प्राप्त करने का कोई तरीका है ?!

रेल में मैं कुछ इस तरह करना होगा:

@event.attendees.each do |att| 
    att.name 
end 

लेकिन redis में मैं नहीं है क्योंकि यह कुंजी और नहीं वास्तविक उद्देश्य यह है कि कुंजी पर संग्रहीत रिटर्न कर सकते हैं।

धन्यवाद :)

उत्तर

38

आइटम पर लूप करना और प्रत्येक तत्व को समकालिक रूप से एक्सेस करना बहुत ही कुशल नहीं है। Redis 2.4 के साथ, वहाँ विभिन्न तरीकों से आप क्या चाहते करने के लिए कर रहे हैं: variadic पैरामीटर का उपयोग करके पाइपलाइनिंग

  • का उपयोग करके प्रकार आदेश
  • का उपयोग करके

    • कमांड
    Redis 2.6 के साथ

    , आप लुआ स्क्रिप्टिंग का भी उपयोग कर सकते हैं, लेकिन यह वास्तव में यहां आवश्यक नहीं है।

    वैसे, आपके द्वारा वर्णित डेटा संरचना को हैश का उपयोग करके सुधार किया जा सकता है। अलग-अलग कुंजी में उपयोगकर्ता डेटा संग्रहीत करने के बजाय, आप उन्हें हैश ऑब्जेक्ट में समूहित कर सकते हैं।

    तरह आदेश का उपयोग करते हुए आप उपयोग कर सकते हैं Redis तरह एक गोल यात्रा में डेटा पुनः प्राप्त करने का आदेश।

    redis> set users:1:name "daniel" 
    OK 
    redis> set users:1:age 24 
    OK 
    redis> set users:2:name "user2" 
    OK 
    redis> set users:2:age 24 
    OK 
    redis> sadd events:1:attendees users:1 users:2 
    (integer) 2 
    redis> sort events:1:attendees by nosort get *:name get *:age 
    1) "user2" 
    2) "24" 
    3) "daniel" 
    4) "24" 
    

    पाइपलाइनिंग

    रूबी ग्राहक समर्थन पाइपलाइनिंग (अर्थात क्षमता Redis करने के लिए कई क्वेरी भेजने और कई उत्तर के लिए प्रतीक्षा करने के लिए) का उपयोग करना।

    keys = $redis.smembers("events:1:attendees") 
    res = $redis.pipelined do 
        keys.each do |x| 
         $redis.mget(x+":name",x+":age") 
        end 
    end 
    

    उपरोक्त कोड केवल दो राउंडट्रिप्स में डेटा पुनर्प्राप्त करेगा।

    variadic पैरामीटर आदेश

    mget आदेश एक शॉट में कई डेटा पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है का उपयोग करना:

    redis> smembers events:1:attendees 
    1) "users:2" 
    2) "users:1" 
    redis> mget users:1:name users:1:age users:2:name users:2:age 
    1) "daniel" 
    2) "24" 
    3) "user2" 
    4) "24" 
    

    लागत यहां भी दो roundtrips है। यह काम करता है अगर आप गारंटी दे सकते हैं कि पुनर्प्राप्त करने के लिए कुंजी की संख्या सीमित है। यदि नहीं, पाइपलाइनिंग एक बेहतर समाधान है।

  • +0

    उत्तर के लिए धन्यवाद! मैं आपके सुझाए गए कोड का प्रयास करने जा रहा हूं! धन्यवाद :) –

    +0

    धन्यवाद @ डिडिएर, नई चीजें सीखने के लिए हमेशा अच्छा! –

    5

    आप इसे एक ब्लॉक में एक Lua script कि एक पाश "सर्वर साइड" चलाता है भेजने के लिए और परिणाम देने के Redis 'EVAL आदेश का उपयोग कर सकते हैं।