2012-07-01 17 views
5

Redis पारंपरिक SQL डेटाबेस है कि मैं का उपयोग से धारणात्मक अलग है, और मैं यह पता लगाने की अगर यह अपने प्रोजेक्ट के लिए सही है ... मैं चारों ओर देख रहा है कोशिश कर रहा हूँ, लेकिन लगता है नहीं कर पा रहे मेरे प्रश्न का उत्तरRedis और क्वैरी मान

मैं उपयोगकर्ता है कि मैं स्टोर करने के लिए, प्रत्येक एक अद्वितीय ID और (जैसे कि उनके नाम के रूप में) कई मूल्यों इसके साथ जुड़े के साथ की जरूरत का एक सेट है। ऐसा लगता है कि मैं सिर्फ एक हैश के रूप में उन स्टोर कर सकते हैं:

message:1a7bcba4849b4c281bfef98a952dcfeb 
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!" 

:

user:fef982dcfe1a7bcba4849b4c281bba95 
"username" "andrewm" "name" "Andrew" 

मैं भी गए संदेशों के एक गुच्छा मैं स्टोर करने के लिए, ऐसे प्रत्येक प्रेषक और प्राप्तकर्ता के रूप में कुछ गुण चाहते हैं मेरा सवाल यह है कि, मैं एक विशिष्ट उपयोगकर्ता द्वारा भेजे गए सभी संदेशों को पुनर्प्राप्त करने के बारे में कैसे जाउंगा (उनके हैश द्वारा निर्दिष्ट)। क्या मुझे इसके बजाय पारंपरिक संबंधपरक डेटाबेस का उपयोग करना चाहिए, या यहां तक ​​कि NooQL डेटाबेस जैसे मोंगोडीबी (जिसे मैंने पहले उपयोग किया है) का उपयोग करना चाहिए? यदि हां, तो क्या किसी के पास उच्च प्रदर्शन स्टोर के लिए कोई सुझाव है? मैं कोई सच्ची खोज नहीं करूँगा (यानी MySQL LIKE प्रश्न) - वास्तव में केवल महत्वपूर्ण मूल्य लुकअप, वास्तव में।

उत्तर

7

यह निश्चित रूप से Redis के साथ इन आंकड़ों मॉडल करने के लिए संभव है, लेकिन आप डेटा संरचनाओं और पहुंच पथ की अवधि में सोचने की जरूरत। रेडिस के साथ पहुंच पथ पूरी तरह से प्रबंधित नहीं होते हैं (जैसे आरडीबीएमएस/मोंगोडीबी में इंडेक्स के साथ)।

प्रदान की उदाहरण के लिए, आप हो सकता है: भेजा है और *: प्राप्त प्रेषकों और प्राप्तकर्ताओं के लिए इसी सेट जोड़ने/हटाने के शीर्ष पर,

user:<user hash> -> hash of user properties 
user:<user hash:sent -> set of <msg hash> 
user:<user hash>:received -> set of <msg hash> 
message:<msg hash> -> hash of message properties 

जोड़ा जा रहा है/किसी संदेश को हटाने * को बनाए रखने का मतलब होगा संदेश ऑब्जेक्ट स्वयं।

किसी उपयोगकर्ता द्वारा भेजे या प्राप्त संदेशों को पुनः प्राप्त करना सिर्फ एक SMEMBERS आदेश, या एक तरह से है अगर आप भी एक ही समय में संदेश के गुणों प्राप्त करना चाहते हैं:

# Get a list of message hash codes only in one roundtrip 
smembers user:<user hash>:received 

# Get a list of message contents in one roundtrip 
sort user:<user hash>:received by nosort get message:*->sender get message:*->message 

उपयोग के बारे में तर्क के लिए प्रकार, देखें:

नोट 1: Redis के साथ, UUID कुंजी के बजाय या हैश कोड (विशेष रूप से सेट में) के रूप में पूर्णांक उपयोग करने के लिए बेहतर है क्योंकि वे एक अधिक कुशल तरीके से जमा हो जाती है।

नोट 2: यदि आपको संदेशों को ऑर्डर करने की आवश्यकता है, तो सूचियों के बजाय सूचियों का उपयोग किया जाना चाहिए। नतीजा केवल सबसे पुराना संदेश हटाया जा सकता है, और केवल न्यूज़ेट संदेशों को एक कुशल तरीके से जोड़ा जा सकता है। आप शायद सभी संदेशों के लिए एक वैश्विक सूची भी जोड़ना होगा।

+0

आपको बहुत बहुत कि explanation-- के लिए यह काफी मददगार था धन्यवाद। मैं इसे और अधिक देख लूँगा :) –

+0

हाय, धन्यवाद, बहुत उपयोगी। यदि "जोड़ने/किसी संदेश को हटाने * को बनाए रखने का मतलब होगा: भेजा है और *: प्राप्त सेट", यह अधिक स्थान की आवश्यकता डाटा स्टोर करने हैं, और इसलिए स्मृति में और अधिक स्थान ले? क्या यह प्रदर्शन के लिए एक मुद्दा हो सकता है अगर इस तरह के "बहु-स्टोर" अक्सर किया जाता है? आपकी मदद के लिए धन्यवाद – Loic

+0

हां, यह स्टोर करने के लिए अधिक डेटा का प्रतिनिधित्व करता है। प्रदर्शन के संबंध में, आपको किसी दिए गए ऑपरेशन के लिए कई आदेश करने के प्रभाव को कम करने के लिए पाइपलाइनिंग का उपयोग करना होगा। Http://redis.io/topics/pipelining देखें –

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