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

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

यह लेख यहां बहुत सारी जानकारी प्रदान कर सकता है:http://redis.io/topics/memory-optimization

Redis (स्पॉइलर . में ऑब्जेक्ट्स की एक सरणी को स्टोर करने के कई तरीके हैं :मुझे अधिकांश उपयोग के मामलों के लिए विकल्प 1 पसंद है):

  1. संपूर्ण ऑब्जेक्ट को JSON-एन्कोडेड स्ट्रिंग के रूप में एक ही कुंजी में संग्रहीत करें और एक सेट (या सूची, यदि अधिक उपयुक्त हो) का उपयोग करके सभी ऑब्जेक्ट्स का ट्रैक रखें। उदाहरण के लिए:

    INCR id:users
    SET user:{id} '{"name":"Fred","age":25}'
    SADD users {id}
    

    सामान्यतया, ज्यादातर मामलों में यह शायद सबसे अच्छा तरीका है। यदि ऑब्जेक्ट में बहुत सारे फ़ील्ड हैं, तो आपके ऑब्जेक्ट अन्य ऑब्जेक्ट्स के साथ नेस्टेड नहीं हैं, और आप एक समय में केवल फ़ील्ड्स के एक छोटे से सबसेट को एक्सेस करते हैं, विकल्प 2 के साथ जाना बेहतर हो सकता है।

    फायदे :एक "अच्छा अभ्यास" माना जाता है। प्रत्येक वस्तु एक पूर्ण विकसित रेडिस कुंजी है। JSON पार्सिंग तेज़ है, खासकर जब आपको इस ऑब्जेक्ट के लिए एक साथ कई फ़ील्ड एक्सेस करने की आवश्यकता होती है। नुकसान :धीमा जब आपको केवल एक ही फ़ील्ड तक पहुँचने की आवश्यकता होती है।

  2. प्रत्येक वस्तु के गुणों को एक रेडिस हैश में संग्रहीत करें।

    INCR id:users
    HMSET user:{id} name "Fred" age 25
    SADD users {id}
    

    फायदे :एक "अच्छा अभ्यास" माना जाता है। प्रत्येक वस्तु एक पूर्ण विकसित रेडिस कुंजी है। JSON स्ट्रिंग्स को पार्स करने की आवश्यकता नहीं है। नुकसान :संभवतः धीमा जब आपको किसी ऑब्जेक्ट में सभी/अधिकांश फ़ील्ड तक पहुंचने की आवश्यकता होती है। साथ ही, नेस्टेड ऑब्जेक्ट्स (ऑब्जेक्ट्स के भीतर ऑब्जेक्ट्स) को आसानी से स्टोर नहीं किया जा सकता है।

  3. रेडिस हैश में प्रत्येक ऑब्जेक्ट को JSON स्ट्रिंग के रूप में संग्रहीत करें।

    INCR id:users
    HMSET users {id} '{"name":"Fred","age":25}'
    

    यह आपको थोड़ा सा समेकित करने की अनुमति देता है और बहुत सारी चाबियों के बजाय केवल दो चाबियों का उपयोग करता है। स्पष्ट नुकसान यह है कि आप प्रत्येक उपयोगकर्ता ऑब्जेक्ट पर टीटीएल (और अन्य सामान) सेट नहीं कर सकते, क्योंकि यह केवल रेडिस हैश में एक फ़ील्ड है और पूर्ण विकसित रेडिस कुंजी नहीं है।

    फायदे :JSON पार्सिंग तेज़ है, खासकर जब आपको इस ऑब्जेक्ट के लिए एक साथ कई फ़ील्ड एक्सेस करने की आवश्यकता होती है। मुख्य कुंजी नामस्थान का कम "प्रदूषणकारी"। नुकसान :जब आपके पास बहुत सारी वस्तुएँ हों तो # 1 के समान स्मृति उपयोग के बारे में। # 2 से धीमा जब आपको केवल एक ही फ़ील्ड तक पहुँचने की आवश्यकता होती है। शायद इसे "अच्छा अभ्यास" नहीं माना जाता है।

  4. प्रत्येक वस्तु की प्रत्येक संपत्ति को एक समर्पित कुंजी में संग्रहीत करें।

    INCR id:users
    SET user:{id}:name "Fred"
    SET user:{id}:age 25
    SADD users {id}
    

    उपरोक्त लेख के अनुसार, यह विकल्प लगभग कभी नहीं है पसंदीदा (जब तक कि वस्तु की संपत्ति में विशिष्ट टीटीएल या कुछ और होना आवश्यक न हो)।

    फायदे :ऑब्जेक्ट गुण पूर्ण विकसित रेडिस कुंजियाँ हैं, जो आपके ऐप के लिए ओवरकिल नहीं हो सकती हैं। नुकसान :धीमा, अधिक मेमोरी का उपयोग करता है, और इसे "सर्वोत्तम अभ्यास" नहीं माना जाता है। मुख्य कुंजी नाम स्थान के बहुत सारे प्रदूषण।

समग्र सारांश

विकल्प 4 आमतौर पर पसंद नहीं किया जाता है। विकल्प 1 और 2 बहुत समान हैं, और वे दोनों काफी सामान्य हैं। मैं विकल्प 1 (आम तौर पर बोलना) पसंद करता हूं क्योंकि यह आपको अधिक जटिल वस्तुओं को संग्रहीत करने की अनुमति देता है (घोंसले की कई परतों के साथ, आदि) विकल्प 3 का उपयोग तब किया जाता है जब आप वास्तव में परवाह करते हैं मुख्य कुंजी नाम स्थान को प्रदूषित न करने के बारे में (अर्थात आप नहीं चाहते कि आपके डेटाबेस में बहुत सारी कुंजियाँ हों और आपको TTL, कुंजी शार्डिंग, या जो कुछ भी हो) जैसी चीज़ों की परवाह नहीं है।

अगर मुझे यहां कुछ गलत मिला है, तो कृपया एक टिप्पणी छोड़ने पर विचार करें और मुझे डाउनवोट करने से पहले उत्तर को संशोधित करने की अनुमति दें। धन्यवाद! :)

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक्सपायर टाइम एक्सप्रेस और रेडिस सेशन

  2. एक रेक कार्य के भीतर रेडिस और रेस्क शेड्यूलर शुरू करने की कोशिश कर रहा है

  3. साइडकीक काम करने की स्थिति

  4. जावा के लिए जेडिस का उपयोग करके डॉकर रेडिस क्लस्टर इंस्टेंस से कैसे कनेक्ट करें?

  5. Node.js, WebSockets और Redis के साथ Resque उपयोग की कल्पना कैसे करें