2013-10-09 10 views
8

कुंजी-मूल्य स्टोर में चाबियों के लिए कुछ नीति परिभाषित करने का प्रयास कर रहे हैं (हम रेडिस का उपयोग कर रहे हैं)। keyspace होना चाहिए:कुंजी-मूल्य स्टोर में कुंजी प्रबंधित करने का एक अच्छा तरीका क्या है?

  • Shardable (अधिक सर्वर लागू करने और उन दोनों के बीच keyspace बाहर फैल सकता है)

  • namespaced (वहाँ कुछ तंत्र के लिए "समूह" कुंजी एक साथ तार्किक होना चाहिए, उदाहरण के लिए डोमेन या संबंधित अवधारणाओं द्वारा)

  • कुशल (कुंजी के लिए डीबी में जितना संभव हो उतना छोटा स्थान उपयोग करने का प्रयास करें, जितना अधिक डेटा एक के रूप में संभव)

  • के रूप में टक्कर-कम संभव (दो अलग-अलग वस्तुओं के लिए कुंजी से बचने के बराबर हो)


दो विकल्प है कि मैं पर विचार किया है इन कर रहे हैं के रूप में:

  1. कुछ वर्णों से अलग नामस्थानों के लिए उपसर्ग का उपयोग करें (जैसे human_resources:person:<some_id>)। इसके ऊपर यह बहुत स्केलेबल और समझने में आसान है। विभाजक के आधार पर नकारात्मक पक्ष संभव संघर्ष होगा (क्या id में वर्ण : है?), और संभवतः आकार दक्षता (बहुत से नेस्टेड नेमस्पेस बहुत लंबी कुंजी बना सकते हैं)।

  2. नेमस्पेस स्टोर करने के लिए कुछ डेटा संरचना (जैसे ऑर्डर्ड सेट या हैश) का उपयोग करें। इसके लिए मुख्य दोष "shardability" का नुकसान होगा, क्योंकि नामस्थानों को स्टोर करने की संरचना को एक डेटाबेस में होना आवश्यक है।

प्रश्न: क्या एक sharded सेटअप में एक keyspace का प्रबंधन करने के लिए एक अच्छा तरीका हो सकता है? क्या हमें इन विकल्पों में से एक का उपयोग करना चाहिए, या क्या कोई अन्य बेहतर, बेहतर पैटर्न है जिसे हमने नहीं माना है?

बहुत बहुत धन्यवाद!

उत्तर

8

रेडिस दुनिया में आम तौर पर स्वीकृत सम्मेलन विकल्प 1 है - यानी कॉलन जैसे चरित्र से अलग नामस्थान। उस ने कहा, नामस्थान लगभग हमेशा एक स्तर गहरे हैं। उदाहरण के लिए: के बजाय person:12321

यह आपके द्वारा निर्धारित 4 दिशानिर्देशों के साथ कैसे काम करता है?

शार्डेबल - यह दृष्टिकोण shardable है। आप इसे कैसे सेट अप करते हैं, इस पर निर्भर करते हुए प्रत्येक कुंजी एक अलग शार्ड या एक ही शार्ड में जा सकती है।

नामांकित इस दृष्टिकोण के साथ टकराव से बचने के लिए नामस्थान के रूप में नामस्थान। हालांकि, समूह कुंजी के लिए नाम के रूप में नामस्थान काम नहीं करते हैं। आम तौर पर, समूह डेटा के तरीके के रूप में कुंजी का उपयोग करना एक बुरा विचार है। उदाहरण के लिए, क्या होगा यदि व्यक्ति विभाग से दूसरे स्थान पर जाता है? यदि आप कुंजी बदलते हैं, तो आपको सभी संदर्भों को अपडेट करना होगा - और यह मुश्किल हो जाता है।

यह सुनिश्चित करने के लिए सबसे अच्छा है कि कुंजी किसी वस्तु के लिए कभी भी परिवर्तित न हो।ग्रुपिंग को अलग इंडेक्स बनाकर बाहरी रूप से संभाला जा सकता है।

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

  1. व्यक्तिगत लोगों चाबियाँ persons:12321
  2. साथ अलग हैश में जाना द्वारा प्रत्येक समूह के लिए एक set बनाएँ - उदाहरण के लिए: persons_by:department - और केवल इस में प्रत्येक व्यक्ति के लिए संख्यात्मक पहचानकर्ता स्टोर सेट। उदाहरण के लिए [12321, 43432]। इस तरह, आप Redis 'पूर्णांक सेट के फायदे मिल

कुशल विधि ऊपर बताया गया है बहुत कुशल स्मृति बुद्धिमान है। कुछ और मेमोरी को बचाने के लिए, आप एप्लिकेशन की तरफ आगे की चाबियों को संपीड़ित कर सकते हैं। उदाहरण के लिए, आप persons:12321 के बजाय p:12321 स्टोर कर सकते हैं। आपको यह केवल तभी करना चाहिए यदि आपने प्रोफाइलिंग के माध्यम से निर्धारित किया है कि आपको ऐसी स्मृति बचत की आवश्यकता है। आम तौर पर, यह लागत के लायक नहीं है।

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

आप इस दृष्टिकोण के साथ दो समस्याओं उल्लेख किया है, और मैं उन्हें

आईडी एक कॉलन है क्या होगा अगर पता करने के लिए कोशिश करेंगे?

यह निश्चित रूप से संभव है, लेकिन आपके एप्लिकेशन के डिज़ाइन को इसे रोकना चाहिए। इसका सबसे अच्छा पहचानकर्ताओं में विशेष पात्रों को अनुमति नहीं देना है - क्योंकि वे कई प्रणालियों में उपयोग किए जाएंगे। उदाहरण के लिए, पहचानकर्ता यूआरएल का हिस्सा होगा, और कॉलन यूआरएल के लिए भी एक आरक्षित चरित्र है।

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

आकार क्षमता

नहीं है लंबे चाबियाँ करने के लिए एक लागत, लेकिन यह बहुत ज्यादा नहीं है। आम तौर पर, आपको चाबियों के बजाए अपने मूल्यों के डेटा आकार के बारे में चिंता करनी चाहिए। यदि आपको लगता है कि चाबियाँ बहुत अधिक मेमोरी का उपभोग कर रही हैं, तो redis-rdb-tools जैसे टूल का उपयोग करके डेटाबेस को प्रोफाइल करें।

यदि आप यह निर्धारित करते हैं कि कुंजी आकार एक समस्या है और स्मृति को सहेजना चाहते हैं, तो आप एक छोटे से रैपर को लिख सकते हैं जो कि उपनाम का उपयोग करके कुंजी को फिर से लिखता है।

+0

अद्भुत जवाब। समय लेने और इस मुद्दे को संबोधित करने के लिए बहुत बहुत धन्यवाद। मैं आपके लिए पहले "बाउंटी" बटन पर क्लिक न करने के लिए क्षमा चाहता हूं, लेकिन यह पहली बार मैंने इसका इस्तेमाल किया है। धन्यवाद! –

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

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