2010-09-27 10 views
8

हाल ही में मैं रेडिस सीख रहा हूं और ईमानदारी से बहुत प्रभावित हूं और इसका उपयोग करने के लिए मर रहा हूं। चीजों में से एक जो मुझे परेशान करता है वह है "मैं रेडिस से कैसे पूछूं"। विशिष्ट मैं निम्नलिखितरेडिस में क्वेरीिंग

को हल करने की कोशिश कर रहा हूँ होने के लिए मैं

usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...} 
usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...} 
usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...} 

नीचे के रूप में जमा हैश के लाखों लोगों की है कृपया ध्यान दें हैश में कई चाबियाँ देखते हैं मैं केवल 4. अब जब कि मैं चाहता हूँ पता चला है कि कहो विशिष्ट तिथि सीमा में, उपयोगकर्ता द्वारा, संसाधन द्वारा या किसी दिए गए अवधि में उपयोगकर्ता के लिए रिकॉर्ड ढूंढने के लिए।

मुझे संदेह है कि ऐसे डेटा को पुनर्प्राप्त करने के लिए रेडिस विशिष्ट पैटर्न हैं। मैं एक अजगर प्रोग्रामर हूं। मैंने रेडस्को (ओम पोर्ट) को देखा जो कुछ quering का समर्थन करता है लेकिन मुझे यकीन नहीं है कि यह सभी डेटा प्राप्त करता है और फिर अजगर में फ़िल्टर करता है।

उत्तर

10

रेडिस के लिए, यह समझने के लिए सबसे अच्छा है कि आप अपने डेटा पर किस प्रकार के क्वेरी पैटर्न चाहते हैं, इससे पहले कि आप इसे स्टोर करने जा रहे हैं।

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

ऊपर अपने उदाहरण में, मैं अपने उदाहरण हैश संग्रहीत कर सकता है के रूप में:

user_to_resource:i = user:j     # key -> value forward map 
resources => (resource:i, created_timestamp) # sorted set 
count_resource:i = quantity     # key -> value quantity map 

है कि, मैं आगे कई और क्वेरी पैटर्न मैं समर्थन करना चाहते हैं पर निर्भर करता है नक्शे रिवर्स चाहते हैं।

+1

सोचा कि यह साझा करने के लिए उपयोगी होगा http://pythonik.blogspot.com/2010/11/redis-patterns-search.html अस्वीकरण: मेरे ब्लॉग पर सूचक – Shekhar

7

आपके द्वारा उल्लेख किए गए प्रश्न समय पर अत्यधिक निर्भर हैं। इस उदाहरण में आप एक क्रमबद्ध सेट का उपयोग करना बुद्धिमान होगा। आप प्रत्येक प्रविष्टि के लिए स्कोर के रूप में डेटाटाइम टिकट का उपयोग कर सकते हैं।

:

sort usage get 
# get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user 

या

lrange usage 0 -1 

एक श्रृंखला के अनुक्रमित पाने के लिए:

hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842 
hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842 
hmset usage:3 created 20100927 quantity 4 resource 1031 user 76 

zadd usage 20200521 1 
zadd usage 20100812 2 
zadd usage 20100927 3 

सब कुछ प्राप्त करने के लिए:

उदाहरण के लिए, आप निम्न कार्य कर सकता है

zrangebyscore usage 20100800 20100900 

हैश कुंजी मान के आधार पर प्रश्नों के लिए, रेडिस के लिए एक उपयोगी जोड़ा है जो लुआ में लिखी गई स्क्रिप्ट के उपयोग की अनुमति देता है। आप आसानी से एक पाइथन हेरेडोक के भीतर एक साधारण लुआ लिपि लिख सकते हैं और स्क्रिप्ट को रेडिस को पास करने के लिए redis.eval विधि का उपयोग कर सकते हैं। स्क्रिप्ट एक लूप हो सकती है जो आपके द्वारा देखे जा रहे मूल्य के आधार पर फ़िल्टर करती है।

संबंधित मुद्दे