आप सही हैं कि रेडिस के साथ केवल साधारण डेटा संरचनाएं उपलब्ध हैं, और उन्हें मूल्य से नहीं बनाया जा सकता है (जैसे आप दस्तावेज़ उन्मुख डेटाबेस जैसे कॉच डीबी या मोंगोडीबी के साथ कर सकते हैं)। हालाँकि, संदर्भ द्वारा डेटा संरचनाएँ बनाना संभव है, और यह एक बहुत ही सामान्य पैटर्न है।
उदाहरण के लिए, एक सेट में निहित आइटम अन्य वस्तुओं (सूचियों, हैश टेबल, अन्य सेट, आदि ...) के लिए कुंजी हो सकते हैं। आइए इसे आपके उदाहरण पर लागू करने का प्रयास करें।
ग्राहकों और डिवाइस+पोर्ट के बीच संबंध बनाने के लिए, आप ग्राहक आईडी वाले सेट का उपयोग कर सकते हैं। ग्राहकों के बारे में जानकारी संग्रहीत करने के लिए, प्रति ग्राहक एक हैश तालिका ठीक है।
ये हैं ग्राहक:
hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4
इन अभिलेखों की कुंजी हैं c:ID
आइए उनमें से दो को एक डिवाइस और पोर्ट से संबद्ध करें:
sadd d:Los_Angeles:11 2 3
इस सेट की कुंजी d:डिवाइस:पोर्ट है। सी:और डी:उपसर्ग सिर्फ एक सम्मेलन है। प्रति डिवाइस/पोर्ट एक सेट बनाया जाना चाहिए। एक दिया गया ग्राहक कई सेटों से संबंधित हो सकता है (और इसलिए कई डिवाइस/पोर्ट से जुड़ा हुआ है)।
अब इस डिवाइस/पोर्ट से जुड़ी डिलीवरी विधियों वाले ग्राहकों को खोजने के लिए, हमें बस सेट की सामग्री को पुनः प्राप्त करना होगा।
smembers d:Los_Angeles:11
1) "2"
2) "3"
तब संबंधित ग्राहक जानकारी को कई hgetall कमांड को पाइपलाइन करके प्राप्त किया जा सकता है:
hgetall c:2
hgetall c:3
1) "name"
2) "Jackson"
3) "protocol"
4) "udp"
5) "snmp_dest"
6) "127.0.0.1"
7) "syslog_dest"
8) "127.0.0.2"
1) "name"
2) "Davis"
3) "protocol"
4) "tcp"
5) "snmp_dest"
6) "127.0.0.3"
7) "syslog_dest"
8) "127.0.0.4"
आदेशों की संख्या से डरो मत। वे बहुत तेज़ हैं, और अधिकांश रेडिस क्लाइंट के पास प्रश्नों को पाइपलाइन करने की क्षमता है ताकि केवल न्यूनतम संख्या में राउंडट्रिप की आवश्यकता हो। केवल एक सदस्य और कई hgetall का उपयोग करके, समस्या को केवल दो राउंडट्रिप के साथ हल किया जा सकता है।
अब, सर्वव्यापी SORT कमांड के लिए धन्यवाद, इसे थोड़ा और अनुकूलित करना संभव है। यह रेडिस में शायद सबसे जटिल कमांड है, और इसका उपयोग यहां एक राउंडट्रिप को बचाने के लिए किया जा सकता है।
sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest
1) "Jackson"
2) "udp"
3) "127.0.0.1"
4) "127.0.0.2"
5) "Davis"
6) "tcp"
7) "127.0.0.3"
8) "127.0.0.4"
एक कमांड में, यह डिवाइस/पोर्ट सेट की सामग्री को पुनः प्राप्त करता है और संबंधित ग्राहक जानकारी प्राप्त करता है।
यह उदाहरण मामूली था, लेकिन अधिक आम तौर पर, जब आप रेडिस के साथ जटिल डेटा संरचनाओं का प्रतिनिधित्व कर सकते हैं, तो यह तत्काल नहीं है। आपको संरचना और डेटा एक्सेस के संदर्भ में मॉडल के बारे में सावधानी से सोचने की ज़रूरत है (यानी डिज़ाइन समय पर, अपने डेटा से चिपके रहें और आपके उपयोग के मामले)।