TypeScript में कैशिंग: Redis और Node.js के लिए अन्य उपकरण
\n\nकैशिंग वेब अनुप्रयोगों के प्रदर्शन को अनुकूलित करने के प्रमुख तंत्रों में से एक है। Node.js पर TypeScript प्रोजेक्ट्स में, कैश API प्रतिक्रिया समय को कम करने, डेटाबेस पर लोड कम करने और बाहरी कॉल पर खर्च कम करने की अनुमति देता है। इस लेख में हम कैशिंग के लिए लोकप्रिय लाइब्रेरीज़, उनके कॉन्फ़िगरेशन और व्यावहारिक उदाहरणों पर चर्चा करेंगे।
\n\nकैशिंग की आवश्यकता क्यों है?
\nकैश के बिना, सर्वर पर प्रत्येक अनुरोध डेटा के पुन: प्रसंस्करण का कारण बन सकता है: DB से पढ़ना, जटिल गणना या बाहरी API तक पहुँचना। कैश पहली कॉल के परिणाम को सहेजता है और बार-बार अनुरोधों पर इसे मिलीसेकंड में प्रदान करता है। मुख्य परिदृश्य:
\n- \n
- बाहरी सेवाओं (मौसम, मुद्रा दरें) से प्रतिक्रियाओं को कैश करना; \n
- अक्सर अनुरोधित डेटा (निर्देशिकाएँ, कॉन्फ़िगरेशन) संग्रहीत करना; \n
- पेज रेंडरिंग समय कम करना; \n
- DB अनुरोधों की संख्या सीमित करना। \n
TypeScript में कैशिंग के लिए लोकप्रिय लाइब्रेरीज़
\n\n1. Redis (ioredis के माध्यम से)
\nRedis एक in-memory डेटा स्टोर है जो सर्वर के रूप में काम करता है। TypeScript के लिए सबसे अच्छा क्लाइंट ioredis है जिसमें पूर्ण प्रकार समर्थन है। स्थापना:
npm install ioredis\nnpm install -D @types/ioredis\n\nTTL (जीवनकाल) के साथ बुनियादी कैश का उदाहरण:
\nimport Redis from 'ioredis';\n\nconst redis = new Redis({\n host: 'localhost',\n port: 6379,\n});\n\n// डेटा को 60 सेकंड के लिए सहेजें\nawait redis.set('user:123', JSON.stringify({ name: 'अन्ना' }), 'EX', 60);\n\n// डेटा प्राप्त करें\nconst cached = await redis.get('user:123');\nif (cached) {\n const user = JSON.parse(cached);\n console.log(user.name); // अन्ना\n}\n\nलाभ: वितरित भंडारण, कुंजियों का स्वचालित निष्कासन, जटिल संरचनाओं (सूचियाँ, हैश) का समर्थन। नुकसान: चालू Redis सर्वर की आवश्यकता, नेटवर्क कॉल पर विलंब।
\n\n2. node-cache (in-memory)
\nnode-cache प्रक्रिया मेमोरी में कैशिंग के लिए एक सरल लाइब्रेरी है। इसे बाहरी निर्भरता की आवश्यकता नहीं है। स्थापना:
\nnpm install node-cache\nnpm install -D @types/node-cache\n\nउदाहरण:
\nimport NodeCache from 'node-cache';\n\nconst myCache = new NodeCache({ stdTTL: 120 }); // डिफ़ॉल्ट TTL 120 सेकंड\n\n// सहेजें\nmyCache.set('config', { theme: 'dark', lang: 'ru' });\n\n// प्राप्त करें\nconst config = myCache.get('config');\nif (config) {\n console.log(config.theme); // dark\n}\n\n// हटाएँ\nmyCache.del('config');\n\nयह छोटे अनुप्रयोगों के लिए उपयुक्त है जहाँ सर्वरों के बीच सिंक्रनाइज़ेशन की आवश्यकता नहीं है।
\n\n3. memory-cache
\nएक और in-memory लाइब्रेरी जिसमें न्यूनतम API है। यह सादगी और निर्भरता की कमी से अलग है:
\nnpm install memory-cache\n\nउदाहरण:
\nimport cache from 'memory-cache';\n\ncache.put('weather', { temp: 22, condition: 'sunny' }, 300_000); // 5 मिनट\n\nconst weather = cache.get('weather');\nif (weather) {\n console.log(`तापमान: ${weather.temp}°C`);\n}\n\n// कुंजी की उपस्थिति की जाँच\nif (cache.keys().includes('weather')) {\n // ...\n}\n\nTypeScript के लिए कैशिंग रणनीतियाँ
\nरणनीति का चुनाव डेटा की प्रकृति पर निर्भर करता है:
\n- \n
- Write-through — डेटा एक साथ कैश और DB में लिखा जाता है। संगति सुनिश्चित करता है, लेकिन लेखन समय बढ़ाता है। \n
- Write-behind — कैश में तत्काल लेखन, DB में अतुल्यकालिक रूप से। तेज़, लेकिन विफलता पर डेटा हानि संभव है। \n
- Cache-aside — एप्लिकेशन स्वयं कैश की जाँच करता है, मिस होने पर DB से पढ़ता है और कैश भरता है। सबसे लोकप्रिय पैटर्न। \n
ioredis के साथ TypeScript में Cache-aside का कार्यान्वयन:
\nasync function getUserById(id: number) {\n const cacheKey = `user:${id}`;\n const cached = await redis.get(cacheKey);\n\n if