जावास्क्रिप्ट में कैशिंग: Redis, Memcached और अंतर्निहित समाधान (उन्नत स्तर)
\n\nआधुनिक वेब डेवलपमेंट में, एप्लिकेशन का प्रदर्शन अक्सर डेटा तक पहुँच की गति पर निर्भर करता है। डेटाबेस या बाहरी API के लिए प्रत्येक अतिरिक्त अनुरोध प्रतिक्रिया समय और सर्वर लोड को बढ़ाता है। कैशिंग केवल "परिणाम को सहेजना" नहीं है, बल्कि सही रणनीति, उपकरण और अमान्यकरण तंत्र चुनने का एक संपूर्ण विज्ञान है। इस लेख में, हम Node.js में कैशिंग की उन्नत तकनीकों पर चर्चा करेंगे: अंतर्निहित समाधानों से लेकर Redis और Memcached जैसी औद्योगिक प्रणालियों तक।
\n\n1. Node.js में अंतर्निहित कैशिंग: सरलता और सीमाएँ
\n\nबाहरी सेवाओं को जोड़ने से पहले, Node.js की अपनी क्षमताओं का मूल्यांकन करना उचित है। अंतर्निहित कैशिंग Map या WeakMap ऑब्जेक्ट्स के साथ-साथ सरल ग्लोबल वेरिएबल्स का उपयोग करके कार्यान्वित की जाती है। यह उन डेटा के लिए आदर्श है जो शायद ही कभी बदलते हैं और एक ही प्रक्रिया के भीतर रहते हैं।
// TTL (Time To Live) के साथ सबसे सरल इन-मेमोरी कैश\nclass MemoryCache {\n constructor(ttl = 60000) {\n this.cache = new Map();\n this.ttl = ttl;\n }\n\n set(key, value) {\n this.cache.set(key, {\n value,\n expiry: Date.now() + this.ttl\n });\n }\n\n get(key) {\n const item = this.cache.get(key);\n if (!item) return null;\n if (Date.now() > item.expiry) {\n this.cache.delete(key);\n return null;\n }\n return item.value;\n }\n\n delete(key) {\n this.cache.delete(key);\n }\n\n clear() {\n this.cache.clear();\n }\n}\n\n// उपयोग\nconst cache = new MemoryCache(30000); // 30 सेकंड TTL\ncache.set('user:42', { name: 'Alice', role: 'admin' });\nconsole.log(cache.get('user:42')); // { name: 'Alice', role: 'admin' }\n\n\nलाभ: शून्य नेटवर्क विलंबता, कार्यान्वयन में सरलता, बाहरी निर्भरता की आवश्यकता नहीं।
\nनुकसान: प्रक्रिया पुनरारंभ होने पर डेटा खो जाता है, कई सर्वरों पर स्केल नहीं होता, एक नोड की रैम तक सीमित।
एक ही प्रक्रिया में काम करने वाले माइक्रोसर्विसेज के लिए, या भारी गणनाओं (जैसे टेम्पलेट रेंडरिंग) के परिणामों को कैश करने के लिए, अंतर्निहित समाधान एक उत्कृष्ट विकल्प है। हालाँकि, वितरित प्रणालियों के लिए यह पर्याप्त नहीं है।
\n\n2. Redis: Node.js में कैशिंग का राजा
\n\nRedis एक इन-मेमोरी डेटा स्टोर है जिसे अक्सर उच्च-प्रदर्शन कैश के रूप में उपयोग किया जाता है। इसके मुख्य लाभ हैं: जटिल डेटा संरचनाओं (स्ट्रिंग्स, लिस्ट्स, सेट्स, हैशेज़) का समर्थन, अंतर्निहित TTL, pub/sub और डिस्क पर स्थायित्व।
\n\nNode.js में Redis को जोड़ना
\n\nNode.js में Redis के साथ काम करने के लिए, ioredis पैकेज (अनुशंसित) या redis का उपयोग किया जाता है। ioredis के साथ एक उदाहरण देखें:
const Redis = require('ioredis');\n\nconst redis = new Redis({\n host: 'localhost',\n port: 6379,\n retryStrategy: (times) => Math.min(times * 50, 2000) // पुन: कनेक्शन रणनीति\n});\n\n// बुनियादी संचालन\nawait redis.set('mykey', 'Hello, Redis!', 'EX', 60); // 60 सेकंड TTL\nconst value = await redis.get('mykey');\nconsole.log(value); // "Hello, Redis!"\n\n// जटिल ऑब्जेक्ट्स को स्टोर करने के लिए हैश का उपयोग\nawait redis.hmset('user:100', {\n name: 'Bob',\n email: 'bob@example.com',\n age: 30\n});\nconst user = await redis.hgetall('user:100');\nconsole.log(user); // { name: 'Bob', email: 'bob@example.com', age: '30' }\n\n\nRedis के साथ उन्नत रणनीतियाँ
\n\nCache-Aside (Lazy Loading): एप्लिकेशन पहले कैश की जाँच करता है, और केवल मिस होने पर डेटाबेस से डेटा प्राप्त करता है और कैश भरता है।
\n\nasync function getUser(userId) {\n const cacheKey = `user:${userId}`;\n let user = await redis.get(cacheKey);\n if (user) {\n return JSON.parse(user);\n }\n // कैश मिस - डेटाबेस से लोड करें\n user = await db.findUserById(userId);\n if (user) {\n await redis.set(cacheKey, JSON.stringify(user), 'EX', 3600); // 1 घंटे के लिए कैश\n }\n ret