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

रेडिस डेटा संरचनाओं का परिचय:सेट

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

रेडिस सेट

Redis सेट स्ट्रिंग्स का अनियंत्रित संग्रह है (एक स्ट्रिंग मूल Redis मान है जिसमें लगभग कुछ भी हो सकता है) जो निरंतर समय जोड़ने, हटाने और सदस्यता जांच प्रदान करता है। रेडिस सेट के बीच यथोचित तेजी से संघ, प्रतिच्छेदन और घटाव संचालन का भी समर्थन करता है। जैसा कि अपेक्षित था, यह बार-बार मूल्यों की अनुमति नहीं देता है।

यहां redis-cli से क्रिया में Redis सेट के कुछ उदाहरण दिए गए हैं . यहां नीचे दिए गए उदाहरण में प्रमुख अभ्यावेदन का सारांश दिया गया है:

  • उपयोगकर्ता:सभी एक वेबसाइट पर पंजीकृत सभी उपयोगकर्ताओं के एक समूह का प्रतिनिधित्व करता है।
  • users:actv सक्रिय उपयोगकर्ताओं का प्रतिनिधित्व करता है।
  • users:inactv निष्क्रिय उपयोगकर्ताओं का प्रतिनिधित्व करता है (वे उपयोगकर्ता जो कुछ समय से साइट पर नहीं आए हैं)।
# sadd key member [member ...] : add members to a set
127.0.0.1:6379> sadd users:all 11 12 13 14 15 Rocket Pocket Socket
(integer) 8
127.0.0.1:6379> type users:all
set
# smembers key: get all members of a set
127.0.0.1:6379> smembers users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "Rocket"
7) "12"
8) "15"
# sismember key member: is the given value a member of the set?
127.0.0.1:6379> sismember users:all 00
(integer) 0
127.0.0.1:6379> sismember users:all 11
(integer) 1
127.0.0.1:6379> sismember users:all Socket
(integer) 1
127.0.0.1:6379> sadd users:inactv 11 12 13
(integer) 3
# sinter key [key ...]: Intersection of multiple sets
# Similar: sinterstore stores the result of intersection of sets to a new set
127.0.0.1:6379> sinter users:all users:inactv
1) "11"
2) "12"
3) "13"
# scard key: cardinality of the set i.e. number of members present in the set
127.0.0.1:6379> scard users:all
(integer) 8
# sdiff key [key ...] : Subtract multiple sets
# Similar: sdiffstore: subtract and store result in a new destination set
127.0.0.1:6379> sdiff users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "12"
7) "Rocket"
8) "15"
127.0.0.1:6379> sdiff users:all users:inactv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
# sdiffstore destination key [key ...]
127.0.0.1:6379> sdiffstore users:actv users:all users:inactv
(integer) 5
127.0.0.1:6379> smembers users:actv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
127.0.0.1:6379> sdiff users:all users:actv users:inactv
(empty list or set)
# smove source destination member: move a member from source set to destination.
127.0.0.1:6379> smove users:inactv users:actv 11
(integer) 1
127.0.0.1:6379> smembers users:actv
1) "Pocket"
2) "11"
3) "Socket"
4) "14"
5) "Rocket"
6) "15"

अन्य महत्वपूर्ण सेट कमांड में शामिल हैं:

  • सनियन - संघ सेट करें
  • SPOP - किसी तत्व को बेतरतीब ढंग से हटा दें
  • SREM - एक या अधिक तत्वों को हटा दें

सेट से संबंधित रेडिस कमांड की पूरी सूची यहां पाई जा सकती है।

Redis इंटर्नल

Redis आंतरिक रूप से सेट को डिक्शनरी के रूप में स्टोर करता है। रेडिस में डिक्शनरी को हैश टेबल के रूप में लागू किया जाता है जो हैश फ़ंक्शन मुरमुरहैश 2 का उपयोग करता है और वृद्धिशील आकार के माध्यम से बढ़ता है। हैश टकराव को जंजीर द्वारा नियंत्रित किया जाता है। सेट में छोटे सेटों के लिए एक विशेष एन्कोडिंग होती है, जब एक सेट के सभी सदस्य इंटसेट्स नामक 64 बिट हस्ताक्षरित पूर्णांकों की श्रेणी # में रेडिक्स 10 में होते हैं। यह अनिवार्य रूप से पूर्णांकों की एक क्रमबद्ध सरणी है। सरणी के भीतर खोज बाइनरी खोज के माध्यम से की जाती है। जाहिर है, यह कार्यान्वयन बहुत छोटे सेटों के लिए कुशल है। जिस आकार तक इस एन्कोडिंग का उपयोग किया जाता है वह सेट-मैक्स-इनसेट-प्रविष्टियों द्वारा नियंत्रित होता है कॉन्फ़िगरेशन पैरामीटर। डिफ़ॉल्ट मान 512 है। रेडिस द्वारा उपयोग की जाने वाली आंतरिक डेटा संरचनाओं का एक अच्छा विवरण यहां पाया जा सकता है।

Redis अनुप्रयोग

यहां कुछ संभावित रेडिस सेट अनुप्रयोगों की एक छोटी सूची दी गई है:

  • एक सेट के रूप में, इसका उपयोग अद्वितीय वस्तुओं को ट्रैक करने के लिए किया जा सकता है:
    • आपकी साइट पर आने वाले सभी अद्वितीय आईपी पते।
    • किसी दिए गए राज्य में वर्तमान में सभी अद्वितीय कार्य उदाहरण, आदि
  • फिर से, एक सेट के रूप में, इसका उपयोग "से संबंधित" या समान संबंध के रूप में दर्शाने के लिए किया जा सकता है:
    • किसी विशेष श्रेणी से संबंधित सभी SKU.
    • एक विशेष टैग के साथ सभी ऑब्जेक्ट, आदि।
  • सेट का उपयोग केवल संबंधों को संयोजित करने के लिए किया जा सकता है, अर्थात सेट का संघ/चौराहे/घटाव:
    • सभी एसकेयू जो टी-शर्ट की श्रेणी से संबंधित हैं, लेकिन पोलो नेक की उपश्रेणी नहीं हैं।

आइए वास्तविक जीवन का एक उदाहरण लें और सेट से संबंधित उपयोग के मामलों को और अधिक एक्सप्लोर करें।

आपके ईबुक स्टोर के लिए विजुअल प्रोफाइलर

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

...
sku: SKU,
pid: Product ID,
title: String,
auth: String,
pub: String,
isbn: ISBN,
edition: Int,
price: Float,
rating: Float,
cats: [String, String ...],
tags: [String, String ...],
...

आप txns नामक संग्रह में लेन-देन भी रिकॉर्ड करते हैं जो इस तरह दिख सकता है:

txnid: TxnID,
cid: CustomerID,
amnt: Float,
curr: Currency,
sku: [sku1, sku2, ...],
time: TimeStamp,
...

और, विचारों के लिए एक संग्रह जिसे views: कहा जाता है

time: TimeStamp, # daily aggregated
cid: CustomerID,
sku: [sku1, sku2, ...],
...

जाहिर है, यह एक अत्यधिक सरलीकृत उदाहरण है जो व्यापक धारणाएं बनाता है। हमारा इरादा (निकट) वास्तविक दुनिया परिदृश्य में एक रेडिस सेट उदाहरण दिखाना है।

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

  • सबसे लोकप्रिय श्रेणी कौन सी है?
  • क्या साइंस फिक्शन को देखने या खरीदने वाले लोग नॉन-फिक्शन को भी देखते हैं?

आप इसे रीयल-टाइम में करने में सक्षम होना चाहते हैं, यानी प्रोफाइलर का UI बॉक्स, बटन पर टिक करेगा जो आपको पैरामीटर बदलने देता है, और परिणाम (लगभग) तुरंत देखेगा।

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

  • आज बेची गई सभी पुस्तकों को खोजने में जो फिक्शन थीं, लेकिन साइंस फिक्शन नहीं, txn को क्वेरी करना शामिल होगा आज के लेनदेन का संग्रह। फिर, अपनी श्रेणियों को एकत्रित करने और फिर $in/$nin संचालन करने के लिए SKU पर पुनरावृति करना।

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

cat:type:catID
cat:sku:fiction
cat:sku:nonfiction
cat:sku:scfiction
cat:sku:history
cat:sku:milhistory
cat:sku:military
...
cat:cid:fiction
cat:cid:nonfiction
cat:cid:scfiction
cat:cid:history
cat:cid:milhistory
cat:cid:military
...

cat:sku:* सेट में उस श्रेणी में आज बेची/देखी गई पुस्तकों के SKU शामिल होंगे। इसी तरह, cat:cid:* में उन ग्राहकों की CID होगी, जिन्होंने उस श्रेणी में किताबें खरीदी/बेची हैं। प्रश्नों का एक नमूना जिसका उत्तर हम इन सेटों के साथ दे सकते हैं:

  • ग्राहक (या ग्राहकों के #) जिन्होंने आज फिक्शन (एकल श्रेणी) की किताबें देखी/खरीदी:smembers cat:cid:fiction
  • ऐसे ग्राहक जिन्होंने इतिहास देखा/खरीदा, लेकिन आज सैन्य इतिहास नहीं देखा:sdiff cat:cid:history cat:cid:milhistory
  • (संख्या) आज बेची गई किताबें जो साइंस फिक्शन और मिलिट्री यानी मिलिट्री साइंस फिक्शन थीं:sinter cat:sku:scfiction cat:sku:military
  • कोई भी संख्या में ऐसे संघ, प्रतिच्छेदन और अंतर संचालन जिनकी आपको परवाह है।

यह स्वयं हमें बहुत शक्तिशाली क्वेरी करने की क्षमता देता है। आइए और सेट जोड़ें! मान लीजिए, हम पुस्तक रेटिंग के आधार पर अतिरिक्त सेट बनाते हैं। उदाहरण के लिए:

rat:sku:5str: Set of books with ratings > 4.5
rat:sku:4str: Set of books with ratings > 3.5 && <= 4.5
rat:sku:3str: ...
rat:sku:2str: ...
...
rat:cid:5str: Set of customer who bought books with ratings as mentioned above.
rat:cid:4str: ...
..

इन सेटों से लैस, अब आप इस तरह की चीजों का शीघ्रता से पता लगाने में सक्षम हैं:

  • आज खरीदी गई 4 स्टार और उससे अधिक रेटिंग वाली फिक्शन किताबें:  sunionstore Rat:sku:4strabv Rat:sku:5str Rat:sku:5str/sinter Rat:sku:4strabv cat :sku:फिक्शन
  • वह ग्राहक जिसने इतिहास में 3 स्टार और उससे अधिक की किताबें खरीदी हैं:sunionstore Rat:cid:5strabv Rat:cid:3str rat:cid:5str rat:cid:5str/sinter बिल्ली:सीआईडी:इतिहास चूहा:सीआईडी:5strabv

अब, मान लें कि आप अपने उन सभी ग्राहकों को डिस्काउंट कूपन भेजना चाहते हैं, जिन्होंने आज ज्योतिष की किताब 2 या उससे कम रेटिंग के साथ खरीदी है (बुरे अनुभव के लिए माफी के रूप में) उस किताब को पढ़ने के लिए!) आप CustomerID . की उस सूची को निर्यात कर सकते हैं बाहर निकालें और इसे अपने ईमेल एप्लिकेशन पर भेजें। इसी तरह, आप अन्य चीज़ों के लिए सेट बना सकते हैं जिन्हें आप अपने विज़ुअल प्रोफाइलर में फ़िल्टर के रूप में दिखाना चाहते हैं जैसे टैग, मूल्य सीमा, आदि।

Redis Sets का उपयोग करने के फायदे यहां स्पष्ट हैं। इन-मेमोरी स्टोर वास्तव में तेजी से पहुंच की ओर ले जाएगा ताकि फ्रंटएंड तड़क-भड़क वाला लगे। इसके अतिरिक्त, रेडिस सेट ऑपरेशन या तो स्थिर समय या रैखिक होते हैं।

निष्कर्ष

इस पोस्ट में, हमने सबसे उपयोगी रेडिस डेटा स्ट्रक्चर्स में से एक उदाहरण के साथ पेश किया:सेट। रेडिस डेटा संरचना श्रृंखला में हमारी कुछ अन्य पोस्ट यहां दी गई हैं:

  • रेडिस हैश
  • रेडिस बिटमैप्स
  • रेडिस सेट
  • रेडिस सॉर्ट किए गए सेट


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. कुंजी समाप्ति पर रेडिस अपडेट सॉर्ट किया गया सेट

  2. रेडिस कमांड का एसिंक्स निष्पादन

  3. पायरो का उपयोग करके पांडस डेटाफ्रेम को रेडिस में कैसे सेट/प्राप्त करें?

  4. Redis कैश से डेटा पुनर्प्राप्त नहीं करेगा

  5. लार्वा के साथ प्रेडिस 5.5 एग्रीगेट/रेडिसक्लस्टर में पूल में कोई कनेक्शन उपलब्ध नहीं है। php:337