2012-06-08 16 views
11

की सदस्यता ली है मैं वर्तमान में देखकर क्या चैनलों एक Redis पब/उप आवेदन मेरे पास में की सदस्यता ली है में दिलचस्पी है।Redis प्रकाशित करें/सदस्यता लें: देखो क्या चैनलों वर्तमान में

user:user_id

इस का कारण यह है कि मैं कौन है "ऑनलाइन" को देखने के लिए सक्षम होना चाहते हैं: एक ग्राहक हमारे सर्वर से कनेक्ट करते हैं, तो हम उन्हें एक चैनल ऐसा दिखता है जैसे रजिस्टर। मैं वर्तमान में बिना किसी चैनल के संदेशों को अंधेरे से आग लगाना जानता हूं कि क्लाइंट ऑनलाइन है या नहीं, क्योंकि यह महत्वपूर्ण नहीं है कि उन्हें इन प्रकार के संदेश प्राप्त हों।

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

यह 100% सही होना जरूरी नहीं है, लेकिन और अधिक सटीक यह, बेहतर है। मुझे लगता है कि जब कोई चैनल सब्सक्राइब हो जाता है तो एक सामान्य कुंजी नहीं बनाई जाती है, इसलिए मैं कुछ ऑनलाइन उपयोगकर्ताओं को खोजने के लिए

redis-cli keys user* के रूप में कुछ भी नहीं कर सकता।

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

उत्तर

1

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

आपके पास ऑनलाइन होने पर उपयोगकर्ता को जोड़ने के लिए एक सेट का उपयोग करने के बारे में सही विचार है, और उसके बाद SISMEMBER <set> <user_id> के साथ यह पूछने के लिए यह पूछें कि संदेश उन्हें भेजे जाने चाहिए या एक बार फिर से प्रक्रिया के लिए रेडिस सूची में जोड़ा गया है ऑनलाइन आओ।

जब उपयोगकर्ता लॉग ऑफ करता है तो आपको पता लगाना होगा ताकि आप उन्हें ऑनलाइन उपयोगकर्ताओं की सूची से निकाल सकें, लेकिन मुझे यह जानने के लिए पर्याप्त नहीं पता कि आप इसके बारे में कैसे जाएंगे।

यदि कनेक्टेड क्लाइंट्स को सर्वर को सूचित करने के लिए संदेश भेजने की क्षमता है कि संदेश (ओं) का उपभोग किया गया था, तो आप इसका उपयोग ट्रैक रखने के लिए कर सकते हैं कि बाद में पुनर्प्राप्ति के लिए कौन से संदेशों को संग्रहीत किया जाना चाहिए।

चीयर्स, माइक

3

वर्तमान में दिखाई चैनलों क्या "मौजूद" की सदस्यता के माध्यम से किया जा रहा के लिए कोई आदेश नहीं है, लेकिन वहाँ है और "अनुमोदित" मुद्दा और एक पुल अनुरोध है कि इस लागू करता है।

https://github.com/antirez/redis/issues/221
https://github.com/antirez/redis/pull/412

इस कॉल की प्रकृति के कारण, यह कुछ है कि माप सकते हैं नहीं है, और इस तरह एक "डीबग" कमांड है।

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

मान लें कि आपका user_ids बढ़ता जा रहा है, तो आप SETBIT का उपयोग करने में रुचि ले सकते हैं ताकि उपयोगकर्ता को ऑफसेट बिट में उपस्थिति को ट्रैक करने के लिए 1 या 0 सेट किया जा सके। फिर आप यह सुनिश्चित करने के लिए कि कोई विशिष्ट उपयोगकर्ता ऑनलाइन है या नहीं, यह देखने के लिए कि आप कितने उपयोगकर्ता ऑनलाइन हैं, और GETBIT पर नए BITCOUNT जैसी अच्छी चीजें कर सकते हैं।

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

+0

ग्रेट सुझाव! मुझे अभी भी वही ज़रूरत थी और ग्राहकों की संख्या प्राप्त करने के लिए चैनल को 'शून्य' प्रकाशित करके इसके आसपास लिखने में कामयाब रहा। फिर श्रोता में मैं जांचता हूं कि संदेश कोई नहीं है और यदि यह है तो इसे छोड़ दें। चीयर्स दोस्त! –

1

संस्करण से 2.8.0 redis एक pubsub आदेश है कि इस मामले में मदद मिलेगी है:

http://redis.io/commands/pubsub

टिप्पणी: वर्तमान में 2.8.0 के राज्य अभी तक स्थिर नहीं है (RC2)

4

Redis 2.8 के रूप में आप कर सकते हैं:

PUBSUB CHANNELS [pattern] 

PUBSUB CHANNELS command है हे (एन) जटिलता, जहां एन सक्रिय चैनलों की संख्या है।

तो अपने मामले में

:

redis-cli PUBSUB CHANNELS user* 

आप आप चाहते हैं चाहते हैं देना होगा।

0

* pubsub NUMSUB [चैनल -1 ... चैनल-एन]
ग्राहकों (पैटर्न की सदस्यता ली ग्राहकों की गिनती नहीं) निर्दिष्ट चैनलों के लिए की संख्या देता है। https://redis.io/commands/pubsub

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