रेडिस पब/सब पर हमारा अवलोकन लेख पब/सब के उद्देश्य पर चर्चा करता है और विशेष रूप से रेडिस पब/सब के डिजाइन विकल्पों का वर्णन करता है। अब हम रेडिस पब की प्रत्येक मुख्य अवधारणा के माध्यम से रेडिस पब/सब का उपयोग करने के तरीके की ओर मुड़ेंगे। /उप:चैनल, प्रकाशन, सदस्यता, और पैटर्न-मिलान, noderedis node.js क्लाइंट का उपयोग करना।
चैनलों को समझना
एक चैनल पब/सबसिस्टम पर प्रकाशित संदेशों को वर्गीकृत करने के लिए इस्तेमाल किया जाने वाला नाम है। चैनल के सिस्टम-निर्भर नाम हो सकते हैं, जैसे system-health:i-36a44b83
,trade-prices:RAX
, temp-reading:living-room
, या कुछ बहुत ही सामान्य, जैसेevents
. चैनल पर दिखाई देने वाले डेटा में रुचि रखने वाला कोई भी ग्राहक इसे सुन सकता है, और सिस्टम के बढ़ने पर नए प्रकाशक और ग्राहक आसानी से जुड़ जाते हैं।
यह पता लगाने के लिए कि रेडिस सर्वर पर कौन से चैनल सक्रिय हैं, आप PUBSUB
CHANNELS
का उपयोग कर सकते हैं कमांड, जो कुछ भी नहीं लौटाता है जब एक सिस्टम अभी तक पब/उप के लिए उपयोग नहीं किया जा रहा है:
$ redis-cli pubsub channels
(empty list or set)
सिस्टम पर चैनल केवल तभी मौजूद होते हैं जब कोई ग्राहक उस पर संदेशों को सुन रहा होता है, इसलिए चैनल को कभी भी "बनाने" या "निकालने" की कोई आवश्यकता नहीं होती है - वे केवल तब मौजूद होते हैं जब एक ग्राहक सुन रहा होता है। इसे देखने के लिए, हम redis-cli
. का उपयोग कर सकते हैं एक कंसोल विंडो में सब्सक्राइबर के रूप में कार्य करने के लिए, और PUBSUB CHANNELS
run चलाएं फिर से दूसरी विंडो में:
कंसोल 1:
$ redis-cli subscribe events
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "events"
3) (integer) 1
कंसोल 2:
$ redis-cli pubsub channels
1) "events"
जैसे ही कंसोल 1 डिस्कनेक्ट करता है, सिस्टम में फिर से कोई चैनल नहीं होगा।
संदेश प्रकाशित करना
कमांड सिंटैक्स
PUBLISH
संदेशों को प्रकाशित करने के लिए कमांड का उपयोग किया जाता है।
PUBLISH channel message
चैनल पर सुनने वाले सभी ग्राहकों को संदेश भेजा जाएगा। यदि कोई सदस्य संदेश प्राप्त करने के लिए आस-पास नहीं है तो संदेश छोड़ दिया जाता है।
Node.js उदाहरण
रेडिस से नियमित कनेक्शन बनाने के बाद, किसी भी अन्य कमांड की तरह प्रकाशित किया जा सकता है:
var client = require("redis").createClient();
client.publish("temp-reading:living-room", "37.0");
अन्य Redis कमांड के साथ उपयोग करना
किसी चैनल पर डेटा प्रकाशित करना एक तेज़ ऑपरेशन है, इसलिए इसे आमतौर पर अन्य कार्यों के साथ मिलकर उपयोग किया जाता है। इस तरह के संयोजन से रेडिस की शक्ति का पता चलता है:
var client = require("redis").createClient();
client.multi()
.publish("temp-reading:living-room", "37.0")
.lpush("recent-temperatures", "37.0")
.ltrim("recent-temperatures", 0, 99)
.exec();
यह पब/सब सिस्टम के लिए पहले के उदाहरण के समान ऑपरेशन है, लेकिन उसी MULTI/EXEC
में है। लेन-देन तापमान को एक सूची में भी धकेल दिया जाता है जो 100 सबसे हाल के तापमानों को बनाए रखता है।
यह संक्षिप्त उदाहरण Redis पब/उप को एक बड़े सिस्टम डिज़ाइन में एकीकृत करने का एक तरीका दिखाता है जिसमें संदेश इतिहास शामिल है। ऊपर की तरह एक ऑपरेशन अन्य क्लाइंट को हाल के मूल्यों के साथ-साथ नए मूल्यों की सदस्यता लेने देता है।
संदेशों की सदस्यता लेना
कमांड सिंटेक्स
SUBSCRIBE
चैनल की सदस्यता के लिए कमांड का उपयोग किया जाता है। यह कमांड क्लाइंट को एक विशेष "सब्सक्राइब" स्थिति में रखता है जहां यह अब अतिरिक्त SUBSCRIBE
के अलावा अन्य कमांड नहीं भेजता है या UNSUBSCRIBE
आदेश।
SUBSCRIBE channel [channel ...]
Node.js उदाहरण
इस ग्राहक का उपयोग पहले के प्रकाशक उदाहरण के साथ किया जा सकता है:
var subscriber = require("redis").createClient();
subscriber.on("message", function(channel, message) {
console.log("A temperature of " + message + " was read.");
});
subscriber.subscribe("temp-reading:living-room");
यह एक साधारण घटना उत्सर्जक का उपयोग करता है जो हर बार संदेश आने पर फ़ंक्शन को कॉल करता है। हैंडलिंग फ़ंक्शन अभी तापमान को कंसोल पर लॉग करता है - यह कुछ भी कर सकता है।
सदस्यों के साथ अन्य कमांड का उपयोग करना
जैसा कि पहले उल्लेख किया गया है, सब्सक्राइब्ड क्लाइंट एक विशेष मोड में हैं और अन्य कमांड के लिए उपयोग नहीं किए जा सकते हैं। अन्य आदेशों का उपयोग करने के लिए, आप Redis के लिए एक अलग क्लाइंट कनेक्शन बनाएंगे:
var redis = require("redis")
, subscriber = redis.createClient()
, client = redis.createClient();
subscriber.on("message", function(channel, message) {
console.log("A temperature of " + message + " was read.");
client.incr("temp-count");
});
subscriber.subscribe("temp-reading:living-room");
यह हैंडलर संदेश को कंसोल में लॉग करता है और रेडिस काउंटर को बढ़ाता है। कुछ मामलों में आप एक परिणाम की गणना कर सकते हैं और फिर उस परिणाम को अन्य ग्राहकों के पढ़ने के लिए अलग चैनल के लिए प्रकाशित कर सकते हैं - बस इसे उसी चैनल पर वापस प्रकाशित न करें जिस पर आप सुन रहे हैं, क्योंकि आप एक अनंत लूप का कारण बनेंगे :)
पैटर्न मिलान
कमांड सिंटेक्स
PSUBSCRIBE
चैनल पैटर्न के मिलान के लिए कमांड का उपयोग किया जाता है।
PSUBSCRIBE pattern [pattern ...]
यह सामान्य SUBSCRIBE
. की तरह ही काम करता है कमांड लेकिन आपको उन नामों के साथ चैनलों का मिलान करने की अनुमति देता है जो एक पैटर्न से मेल खाते हैं। यह प्रकाशकों को उनके द्वारा प्रकाशित की जाने वाली जानकारी के बारे में बहुत विशिष्ट होने देता है, और ग्राहकों को उनके सटीक नामों को जाने बिना कई चैनलों को सुनने की अनुमति देता है।
समर्थित पैटर्न सरल हैं:*
किसी भी वर्ण से मेल खाता है, ?
एक एकल वर्ण से मेल खाता है, और ब्रैकेट का उपयोग स्वीकार्य वर्णों के एक सेट से मेल खाने के लिए किया जा सकता है, जैसे [acd]
।
कई कमरों से तापमान रीडिंग का मिलान करें:
PSUBSCRIBE temp-reading:*
site-link:logo:a:clickrate
. जैसे ए/बी परीक्षणों से घटनाओं का मिलान करें औरsite-link:logo:b:clickrate
:
PSUBSCRIBE site-link:logo:?:clickrate
system-health:us-east-1a:i-36a44b83
जैसे प्रकाशित इवेंट के लिए, AWS इंस्टेंस की एक शृंखला में इवेंट का मिलान करें और system-health:us-east-1c:i-73657420636f636f6
:
PSUBSCRIBE system-health:us-east-1[acd]:i-*
Node.js उदाहरण
इस उदाहरण में, जिसका उपयोग पिछले प्रकाशन उदाहरण के साथ भी किया जा सकता है, उस कमरे के साथ तापमान लॉग किया जाता है जहां तापमान पढ़ा गया था।
var subscriber = require("redis").createClient();
subscriber.on("pmessage", function(pattern, channel, message) {
var room = channel.split(":")[1];
console.log("A temperature of " + message + " was read in " + room);
});
subscriber.psubscribe("temp-reading:*");
पैटर्न-आधारित ग्राहक को इसके कॉलबैक में कुछ और विवरण मिलते हैं:न केवल चैनल और संदेश, बल्कि विशेष पैटर्न जो मेल खाते थे - चूंकि ग्राहक कई चैनलों या पैटर्न पर सुन सकते हैं।
साइड नोट:PUBLISH
की प्रदर्शन विशेषताएँ
रेडिस में प्रत्येक कमांड में एक प्रलेखित समय जटिलता होती है, और अधिकांश समय ये जटिलताएं सहज होती हैं। चूंकि PUBLISH
ऑपरेशन बहुत आसान लगता है (लगभग SET
. की तरह) ) कोई यह मान सकता है कि इसकी जटिलता O(1) है। वास्तव में PUBLISH
. की समय जटिलता ग्राहकों के व्यवहार के अनुसार रैखिक रूप से बढ़ता है।
जब PUBLISH
कमांड चलता है, इसे चैनल से मेल खाने वाले सभी पैटर्न के माध्यम से कदम उठाना चाहिए और सभी ग्राहक जिन्हें संदेश प्राप्त करना चाहिए, जिसके परिणामस्वरूप O(N+M) की समय जटिलता होती है।
PUBLISH
. की जटिलता के कारण अधिकांश परिनियोजन कभी भी प्रदर्शन संबंधी किसी समस्या का अनुभव नहीं करेंगे , लेकिन समय के साथ उस कमांड के प्रदर्शन को ट्रैक करना अभी भी बुद्धिमानी है - सावधान रहें यदि आपका कोड स्वचालित रूप से सुनने के लिए चैनलों के पैटर्न उत्पन्न करता है।
आपका कोड यहां है?
हम रेडिस पब/सब का उपयोग करके बनाए गए ऐप्स के कुछ बेहतरीन उदाहरणों का वॉक-थ्रू पेश करना पसंद करेंगे। यदि आप कुछ अच्छे उदाहरणों के बारे में जानते हैं, तो हमें [email protected] पर एक नोट भेजें - हम जो कोड देखते हैं उनमें से कुछ को दिखाने के लिए हम अपनी पूरी कोशिश करेंगे।