C++ में कैशिंग: Redis, Memcached और अंतर्निहित समाधान: A से Z तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: C++ में कैशिंग की आवश्यकता क्यों?

\n\n

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

\n\n

C++ भाषा डेवलपर्स को कुशल कैशिंग सिस्टम बनाने के लिए अद्वितीय क्षमताएं प्रदान करती है: मेमोरी पर सूक्ष्म नियंत्रण से लेकर शक्तिशाली बाहरी टूल के उपयोग तक। इस लेख में, हम सरल अंतर्निहित समाधानों से लेकर Redis और Memcached जैसी औद्योगिक प्रणालियों तक की यात्रा करेंगे, और समझेंगे कि कब और कौन सा दृष्टिकोण चुनना चाहिए।

\n\n

आप सीखेंगे:

\n
    \n
  • बिना किसी तृतीय-पक्ष लाइब्रेरी के C++ में एक सरल कैश कैसे लागू करें।
  • \n
  • Redis और Memcached को कैसे कनेक्ट और उपयोग करें।
  • \n
  • प्रत्येक दृष्टिकोण के प्रदर्शन और उपयोग परिदृश्यों की तुलना।
  • \n
\n\n

अंतर्निहित समाधान: अपना स्वयं का C++ कैश

\n\n

बाहरी सेवाओं को कनेक्ट करने से पहले, यह समझना महत्वपूर्ण है कि कई कार्यों के लिए अंतर्निहित कैश पर्याप्त है। मुख्य लाभ: शून्य नेटवर्क विलंबता, सरल तैनाती और डेटा पर पूर्ण नियंत्रण।

\n\n

std::unordered_map पर सबसे सरल कैश

\n

सबसे बुनियादी विकल्प एक एसोसिएटिव ऐरे का उपयोग करना है। हालांकि, इसमें डेटा निष्कासन नीति (eviction policy) नहीं है और यह अनिश्चित काल तक बढ़ता रहेगा, जिससे मेमोरी ओवरफ्लो हो सकती है।

\n\n
#include <unordered_map>\n#include <string>\n\nclass SimpleCache {\n    std::unordered_map<std::string, std::string> cache_;\npublic:\n    void put(const std::string& key, const std::string& value) {\n        cache_[key] = value;\n    }\n    std::string get(const std::string& key) {\n        auto it = cache_.find(key);\n        if (it != cache_.end()) {\n            return it->second;\n        }\n        return ""; // या अपवाद फेंकें\n    }\n};
\n\n

LRU-कैश (Least Recently Used)

\n

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

\n\n
#include <list>\n#include <unordered_map>\n\ntemplate<typename K, typename V>\nclass LRUCache {\n    size_t capacity_;\n    std::list<std::pair<K, V>> items_;\n    std::unordered_map<K, typename std::list<std::pair<K, V>>::iterator> cache_;\n\npublic:\n    LRUCache(size_t cap) : capacity_(cap) {}\n\n    V get(const K& key) {\n        auto it = cache_.find(key);\n        if (it == cache_.end()) {\n            throw std::runtime_error("Key not found");\n        }\n        items_.splice(items_.begin(), items_, it->second);\n        return it->second->second;\n    }\n\n    void put(const K& key, const V& value) {\n        auto it = cache_.find(key);\n        if (it != cache_.end()) {\n            it->second->second = value;\n            items_.splice(items_.begin(), items_, it->second);\n            return;\n        }\n        if (items_.size() == capacity_) {\n            auto last = items_.back();\n            cache_.erase(last.first);\n            items_.pop_back();\n        }\n        items_.emplace_front(key, value);\n        cache_[key] = items_.begin();\n    }\n};
\n\n

ऐसा कैश एक ही प्रक्रिया में काम करने के लिए आदर्श है, जब डेटा केवल उसी प्रक्रिया का हो और उसे सिंक्रनाइज़ेशन की आवश्यकता न हो।

\n\n

Memcached: सरल डेटा के लिए वितरित कैश

\n\n

Memcached एक हल्की, उच्च-प्रदर्शन कैशिंग प्रणाली है जो TCP/UDP प्रोटोकॉल पर काम करती है। यह डेटा को RAM में संग्रहीत करती है और स्थायित्व (persistence) का समर्थन नहीं करती है। डेटाबेस क्वेरी परिणामों या API प्रतिक्रियाओं को कैश करने के लिए एक उत्कृष्ट विकल्प।

ब्लॉग

पुस्तक अनुशंसाएँ