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

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

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

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

परिचय: C++ प्रदर्शन के लिए कैशिंग क्यों महत्वपूर्ण है

\n

आधुनिक उच्च-लोड C++ विकास में, कैशिंग एक विकल्प नहीं रह गया है - यह आर्किटेक्चर का एक अनिवार्य तत्व है। इसके बिना, कोई भी CRUD सिस्टम या माइक्रोसर्विस जल्दी से डेटाबेस की सीमाओं से टकरा जाता है, और अनुरोधों की विलंबता (latency) तेजी से बढ़ती है। उन्नत स्तर पर, हम एक दुविधा का सामना करते हैं: बाहरी सिस्टम (Redis, Memcached) का उपयोग करें या C++ में अपना स्वयं का in-memory समाधान तैनात करें? इस लेख में, हम नेटवर्क कतारों, लॉक और सीरियलाइज़ेशन के साथ काम करने के अभ्यास के आधार पर, प्रत्येक दृष्टिकोण के फायदे, नुकसान और विशिष्ट कार्यान्वयन पर चर्चा करेंगे।

\n\n

1. Redis: लचीलापन और डेटा संरचनाएँ

\n

Redis केवल key-value स्टोर नहीं है। इसका मुख्य लाभ डेटा प्रकारों का समृद्ध सेट है: स्ट्रिंग्स, हैश, लिस्ट्स, सेट्स, सॉर्टेड सेट्स। C++ के लिए कई क्लाइंट मौजूद हैं: redis-plus-plus (अनुशंसित) और hiredis (निम्न-स्तरीय)।

\n

redis-plus-plus के साथ कनेक्शन और बुनियादी संचालन का उदाहरण

\n
#include <sw/redis++/redis++.h>\n#include <iostream>\n\nint main() {\n    // Redis से कनेक्शन (डिफ़ॉल्ट रूप से localhost:6379)\n    sw::redis::Redis redis("tcp://127.0.0.1:6379");\n\n    // 60 सेकंड TTL के साथ मान सेट करना\n    redis.set("user:1001", "John Doe", std::chrono::seconds(60));\n\n    // पढ़ना\n    auto val = redis.get("user:1001");\n    if (val) {\n        std::cout << "User: " << *val << std::endl;\n    }\n\n    // हैश के साथ काम करना\n    redis.hset("session:abc", "token", "xyz123");\n    redis.hset("session:abc", "expires", "3600");\n    auto token = redis.hget("session:abc", "token");\n    std::cout << "Token: " << *token << std::endl;\n\n    return 0;\n}\n
\n

उन्नत विशेषताएँ: redis.multi() और redis.exec() के माध्यम से ट्रांज़ैक्शन का उपयोग, साथ ही कैश अमान्यकरण सूचनाओं के लिए Pub/Sub। Redis तब उपयुक्त है जब आपको जटिल संरचनाओं को परमाणु संचालन (जैसे काउंटर इंक्रीमेंट) के साथ संग्रहीत करने की आवश्यकता होती है।

\n\n

2. Memcached: गति और सरलता

\n

Memcached एक हल्का वितरित कैश है, जो फ्लैट डेटा (स्ट्रिंग्स और बाइनरी ब्लॉब्स) को संग्रहीत करने के लिए अनुकूलित है। यह ट्रांज़ैक्शन या जटिल संरचनाओं का समर्थन नहीं करता है, लेकिन गति और न्यूनतम मेमोरी खपत में बेहतर है। C++ के लिए हम libmemcached लाइब्रेरी का उपयोग करते हैं।

\n

libmemcached के माध्यम से Memcached के साथ काम करने का उदाहरण

\n
#include <libmemcached/memcached.h>\n#include <iostream>\n#include <cstring>\n\nint main() {\n    memcached_st *memc = memcached_create(nullptr);\n    memcached_server_st *servers = nullptr;\n    memcached_return_t rc;\n\n    // सर्वर जोड़ना\n    servers = memcached_server_list_append(servers, "127.0.0.1", 11211, &rc);\n    rc = memcached_server_push(memc, servers);\n    if (rc != MEMCACHED_SUCCESS) {\n        std::cerr << "Error: " << memcached_strerror(memc, rc) << std::endl;\n        return 1;\n    }\n\n    // 30 सेकंड TTL के साथ लिखना\n    const char *key = "config:db_host";\n    const char *value = "10.0.0.1";\n    rc = memcached_set(memc, key, strlen(key), value, strlen(value), \n                       std::time(0) + 30, (uint32_t)0);\n    if (rc != MEMCACHED_SUCCESS) {\n        std::cerr << "Set failed: " << memcached_strerror(memc, rc) << std::endl;\n    }\n\n    // पढ़ना\n    size_t val_len;\n    uint32_t flags;\n    char *retrieved = memcached_get(memc, key, strlen(key), &val_len, &flags, &rc);\n    if (rc == MEMCACHED_SUCCESS) {\n        std::cout << "DB Host: " << retrieved << std::endl;\n        free(retrieved);\n    }\n\n    memcached_free(memc);\n    return 0;\n}\n
\n

Memcached कब चुनें? यदि आपको जटिल संरचनाओं को संग्रहीत करने की आवश्यकता के बिना, सीरियलाइज़्ड ऑब्जेक्ट्स के लिए एक सरल कैश की आवश्यकता है। Memcached SQL क्वेरी परिणामों या HTML फ्रैगमेंट्स को कैश करने के लिए आदर्श है।

ब्लॉग

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