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

स्टैक ओवरफ़्लो, रेडिस और कैश अमान्यकरण

मैं ईमानदारी से यह तय नहीं कर सकता कि यह SO प्रश्न है या MSO प्रश्न है, लेकिन:

दूसरे सिस्टम में जाना कभी नहीं . है स्थानीय मेमोरी को क्वेरी करने की तुलना में तेज़ (जब तक यह कुंजीबद्ध है); सरल उत्तर:हम दोनों का उपयोग करते हैं! तो हम उपयोग करते हैं:

  • स्थानीय स्मृति
  • अन्यथा रेडिस जांचें, और स्थानीय मेमोरी अपडेट करें
  • अन्यथा स्रोत से प्राप्त करें, और रेडिस और स्थानीय मेमोरी को अपडेट करें

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

उपकरण:उबंटू सर्वर पर रेडिस; बुकस्लीव रेडिस रैपर के रूप में; पैकेजिंग डेटा के लिए प्रोटोबफ-नेट और GZipStream (आकार के आधार पर स्वचालित रूप से सक्षम / अक्षम)।

तो:रेडिस पब/उप ईवेंट का उपयोग किसी दिए गए कुंजी के लिए एक से कैश को अमान्य करने के लिए किया जाता है नोड (जो जानता है कि राज्य बदल गया है) तुरंत (काफी) सभी नोड्स।

अलग-अलग प्रक्रियाओं के बारे में (टिप्पणियों से, "क्या आप एक ही डेटा को खिलाने वाली कई अलग-अलग प्रक्रियाओं के लिए किसी भी तरह के साझा मेमोरी मॉडल का उपयोग करते हैं?"):नहीं, हम ऐसा नहीं करते हैं। प्रत्येक वेब-स्तरीय बॉक्स वास्तव में केवल एक प्रक्रिया (किसी भी दिए गए स्तर की) की मेजबानी कर रहा है, जिसमें बहु-किरायेदारी भीतर है इसलिए, उसी प्रक्रिया के अंदर हमारे पास 70 साइटें हो सकती हैं। पुराने कारणों से (यानी "यह काम करता है और इसे ठीक करने की आवश्यकता नहीं है") हम मुख्य रूप से कुंजी के हिस्से के रूप में साइट-पहचान के साथ http कैश का उपयोग करते हैं।

सिस्टम के कुछ बड़े पैमाने पर डेटा-गहन भागों के लिए, हमारे पास डिस्क पर बने रहने के लिए तंत्र हैं ताकि इन-मेमोरी मॉडल को लगातार ऐप-डोमेन के बीच पारित किया जा सके क्योंकि वेब स्वाभाविक रूप से रीसायकल (या फिर से तैनात) है, लेकिन वह है रेडिस से असंबंधित।

यहां एक संबंधित उदाहरण दिया गया है जो केवल व्यापक स्वाद . दिखाता है यह कैसे काम कर सकता है - निम्नलिखित में से कई उदाहरणों को स्पिन करें, और फिर इसमें कुछ प्रमुख नाम टाइप करें:

static class Program
{
    static void Main()
    {
        const string channelInvalidate = "cache/invalidate";
        using(var pub = new RedisConnection("127.0.0.1"))
        using(var sub = new RedisSubscriberConnection("127.0.0.1"))
        {
            pub.Open();
            sub.Open();

            sub.Subscribe(channelInvalidate, (channel, data) =>
            {
                string key = Encoding.UTF8.GetString(data);
                Console.WriteLine("Invalidated {0}", key);
            });
            Console.WriteLine(
                    "Enter a key to invalidate, or an empty line to exit");
            string line;
            do
            {
                line = Console.ReadLine();
                if(!string.IsNullOrEmpty(line))
                {
                    pub.Publish(channelInvalidate, line);
                }
            } while (!string.IsNullOrEmpty(line));
        }
    }
}

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis और Node.js और Socket.io प्रश्न

  2. संदेश दलाल के रूप में रेडिस

  3. रेडिस में आप अधिकतम मूल्य आकार क्या स्टोर कर सकते हैं?

  4. स्प्रिंग डेटा RedisTemplate:मान और हैशवैल्यू को क्रमबद्ध करना

  5. रेडिस में पाइपलाइन का उपयोग करते समय 100,000 रिकॉर्ड के साथ इतना धीमा क्यों है?