रेडिस प्रमुख नामकरण सम्मेलनों?


226

रेडिस में कुंजियों के लिए सामान्य नामकरण सम्मेलन क्या हैं? मैंने मूल्यों को अलग करके देखा है: लेकिन मुझे यकीन नहीं है कि सामान्य सम्मेलन क्या है, या क्यों है।

एक उपयोगकर्ता के लिए आप कुछ ऐसा करेंगे ...

user:00

यदि उपयोगकर्ता की आईडी थी 00

क्या आप सभी उपयोगकर्ताओं को वापस करने के लिए कुंजी की शुरुआत के लिए क्वेरी कर सकते हैं?

मैं मुख्य रूप से लोगों के लिए काम करने के तरीकों पर शोध करके किसी भी भविष्य की समस्याओं से बचने की उम्मीद कर रहा हूं और उन्हें क्यों चुना।

जवाबों:


205

रेडिस में कुंजियों के लिए सामान्य नामकरण सम्मेलन क्या हैं? मैंने मूल्यों को अलग करके देखा है: लेकिन मुझे यकीन नहीं है कि सामान्य सम्मेलन क्या है, या क्यों है।

हां, :कुंजी का नामकरण करते समय कोलन साइन एक सम्मेलन है। में इस redis वेबसाइट पर ट्यूटोरियल कहा गया है: एक स्कीमा के साथ छड़ी की कोशिश करें। उदाहरण के लिए "ऑब्जेक्ट-टाइप: आईडी: फ़ील्ड" एक अच्छा विचार हो सकता है, जैसे "उपयोगकर्ता: 1000: पासवर्ड"। मुझे बहु-शब्द फ़ील्ड्स के लिए डॉट्स का उपयोग करना पसंद है, जैसे "टिप्पणी: 1234: उत्तर.तो"।

क्या आप सभी उपयोगकर्ताओं को वापस करने के लिए कुंजी की शुरुआत के लिए क्वेरी कर सकते हैं?

यदि आपका मतलब है कि सभी कुंजियों के लिए सीधे क्वेरी करना जैसे कि user:वहाँ से शुरू होता है तो उसके लिए एक कुंजी कमांड है। हालाँकि यह कमांड केवल डिबगिंग उद्देश्य के लिए उपयोग की जानी चाहिए क्योंकि यह O (N) है क्योंकि यह डेटाबेस में संग्रहीत सभी कुंजी के माध्यम से खोज कर रहा है।

इस समस्या के लिए अधिक उपयुक्त समाधान समर्पित कुंजी बनाने के लिए जाने का नाम है, है users, जिसमें, उदाहरण के लिए सभी उपयोगकर्ताओं कुंजी संग्रहीत करेगा सूची या सेट डेटा संरचना।


1
scan@ विकल्प नहीं है। EranH।, यह कुंजी को पुनरावृत्त करने के लिए सबसे अच्छा अभ्यास है। scanतत्वों के संग्रह पर वृद्धिशील रूप से पुनरावृत्ति करने के लिए उपयोग किया जाता है।
किशोर पवार

2
@ yojimbo87 तो दो कमांड होंगे जो कहते हैं कि पहले कुंजी बनाने के लिए है - उपयोगकर्ता: 808021: पासवर्ड = XYZ और दूसरा एक कुंजी को रजिस्ट्री या इंडेक्स (सेट) में रखना है, लेकिन क्या होगा जब एक कमांड सफलतापूर्वक निष्पादित हो और अन्य विफल हो जाता है मतलब है कि चाबियाँ बनाई गई हैं, लेकिन रजिस्ट्री में प्रवेश नहीं मिलता है।
लवटोडकोड

1
@LoveToCode आप उन लेन-देन का उपयोग कर सकते हैं जो यह गारंटी दें कि सभी या किसी भी संचालन को निष्पादित नहीं किया जाएगा।
योजिम्बो87

2
मैंने यह भी देखा कि रेडिस डेस्कटॉप मैनेजर (एक रेडिस क्लाइंट टूल) भी बृहदान्त्र का इलाज करता है ':' विभाजक के रूप में, और एक साथ समूहीकृत कई कुंजियों को प्रदर्शित करता है
एडम रोटारू

1
मेरी राय है कि अद्वितीय मूल्य अंतिम होना चाहिए। यह आसान की तरह कुछ करने के लिए बनाता है:$redis->delete($redis->keys('user:password:*'));
Crayons

26

हम एक कोलन का उपयोग करते हैं (:) नेमस्पेस विभाजक और हैश (#) कुंजी के आईडी-पुर्जों के लिए, जैसे:

logistics:building#23

यदि आपके पास लोकेल, श्रेणी आदि जैसी अधिक कुंजी है, तो सबसे अच्छा नाम सम्मेलन क्या है? {संसाधन}: {कुंजी} # {मूल्य}, {कुंजी} # {मूल्य} => ग्रंथ: स्थान # एन, श्रेणी # 15? या आपके पास कोई और सुझाव है?
fasasvari

1
मेरे उदाहरण में, "बिल्डिंग" सिर्फ "संग्रह" का नाम है, और 23 कस्टम "आईडी" है। यदि आपके पास लोकेल = एन और श्रेणी = 15 के साथ एक समग्र आईडी है, तो वास्तविक आईडी {en, 15} हो सकती है, इसलिए नामस्थान: ग्रंथ # {एन, 15}, या अधिक क्रिया: नाम स्थान: ग्रंथ # लोकेल = hi, श्रेणी = 15}। लेकिन यह सिर्फ एक विचार है, मैंने इसे कभी इस तरह से इस्तेमाल नहीं किया है। आईडी-तत्वों के क्रम को बदलने के लिए नहीं सावधान रहें, क्योंकि कुंजी निश्चित रूप से नहीं मिलेगी। दरअसल, अपने प्रमुख नामों में ऐसी जटिलता को एन्कोडिंग करने के बजाय, रेडिस डेटा संरचनाओं का उपयोग करने पर विचार करें। पर एक नज़र डालें redis.io/topics/indexes
कील

16

एक सम्मलेन लगता है कि बृहदान्त्र (:) लेकिन मैं एक वेब डेवलपर हूँ इसलिए मैं विभाजक के लिए व्यक्तिगत रूप से स्लैश (/) पसंद करता हूँ। स्लैश URL के भीतर पहले से ही इतना महत्वपूर्ण विभाजक है जो संसाधनों के लिए समान प्रकार के यूनिफ़ॉर्म रिसोर्स लोकेटर हैं । बृहदान्त्र के साथ एक अलग दृष्टिकोण क्यों लेना है (:)? क्या यह कुछ मदद करता है?

इस उदाहरण पर विचार करें:

हमारे पास खिलौना वस्तुओं के लिए एक प्रतिष्ठित एपीआई है। एक है:

http://example.com/api/toy/234 

हमने इसे कहां संग्रहीत किया है? हम Redis और स्लैश का उपयोग करते हैं ताकि कुंजी स्पष्ट हो:

toy/234

यह खिलौने के लिए अद्वितीय कुंजी है। कुंजी अब क्लाइंट साइड पर भी उपयोग की जा सकती है:

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

एक उपयोगकर्ता कुंजी के साथ एक वस्तु का अनुरोध करता है toy/666। रेडिस से इसे कैसे प्राप्त करें? Node.js संबंधित उदाहरण:

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

स्लैश को कॉलोन में बदलने की आवश्यकता नहीं है और इसके विपरीत। सुविधाजनक, क्या आपको नहीं लगता?

नोट: हमेशा यह सुनिश्चित करें कि उपयोगकर्ता केवल आपके इच्छित चीजों तक ही पहुँच बना सके। ऊपर दिए गए कच्चे URL-से-कुंजी दृष्टिकोण के user/1/passwordरूप में अच्छी तरह से लाने में सक्षम है , साथ ही टिप्पणीकारों द्वारा नोट किया गया है। यह एक समस्या नहीं होनी चाहिए यदि आप सार्वजनिक रीड-ओनली कैश के रूप में रेडिस का उपयोग करते हैं।


24
... सुविधाजनक, और लगभग घृणित असुरक्षित। आप curl http://example.com/api/user/1/password'डी', या समान पाने के लिए भीख माँग रहे हैं । (बस 'कह रहे हैं।)
ELLIOTTCABLE

3
कोलन, हैश और स्लैश घोंसले के विभिन्न स्तरों, जैसे नामित करने के लिए इस्तेमाल किया जा सकताUser#23:uploads:my/path/to/file.ext
अवतार

31
कृपया, डेटाबेस में कुंजी के रूप में उपयोगकर्ता इनपुट को कभी न लें।
लाइल

1
मुझे पसंद है कि आपने कैसे सोचा कि आप स्लैश पसंद करते हैं क्योंकि आप एक वेब डेवलपर हैं।
हेक्टर ऑर्डोनेज़

@ELLIOTTCABLE धन्यवाद, असुरक्षा के बारे में जोड़ा गया नोट। क्या आपको इस दृष्टिकोण में कोई समस्या दिखाई देती है यदि Redis को सार्वजनिक रीड-ओनली कैश के रूप में उपयोग किया जाता है?
अक्सेली पैलेन

6

मुझे नहीं पता कि क्या वास्तव में रेडिस कुंजी नामकरण के लिए व्यापक "सर्वोत्तम अभ्यास" हैं।

मैंने अपने विभाजकों के रूप में ASCII NUL पात्रों का उपयोग करने के साथ प्रयोग किया है (चूंकि रेडिस और पायथन दोनों 8-बिट साफ हैं)। यदि आप कच्ची चाबियां देख रहे हैं तो यह थोड़ा बदसूरत लगता है, लेकिन विचार यह है कि इसे अमूर्त परत के पीछे छिपा दिया जाए। बृहदान्त्र और पाइप प्रतीक स्पष्ट विकल्प हैं जब तक कि आपके नाम स्थान के घटकों को या तो उन्हें उपयोग न करने की गारंटी दी जाती है या आप प्रत्येक घटक को आवश्यक रूप से एन्कोड करने के लिए तैयार हैं। हालाँकि, अगर आप उन्हें एन्कोडिंग करेंगे तो आप एब्सट्रैक्शन लेयर को विकसित करना चाहेंगे और वैसे भी कच्ची चाबियों को देखने से बचेंगे ... जो मुझे मेरे तर्क में सिर्फ 0 का उपयोग करके वापस लाया।

मुझे यह देखने में दिलचस्प होगा कि क्या इस पर कोई अन्य राय व्यक्त की जाती है।


0

आपके usecase के लिए यह मुझे लगता है कि HSET / HGET एक बेहतर फिट होगा। HKEYS भी है कमांड ।

उन सभी आदेशों में GET / SET / KEYS जैसी ही जटिलता है, तो उनका उपयोग क्यों न किया जाए?

आपके पास तब यह संरचना हो सकती है:

  • उपयोगकर्ता> 00> मूल्य
  • उपयोगकर्ता> 01> मूल्य

या:

  • उपयोगकर्ता: उपयोगकर्ता नाम> 00> मान
  • उपयोगकर्ता: उपयोगकर्ता नाम> 01> मूल्य

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.