Kotlin में डेटा कैशिंग: बिना जादू के ऐप को 10 गुना तेज़ कैसे करें
\n\nकल्पना करें: आप अपना पसंदीदा ऐप खोलते हैं, और वह 5 सेकंड लोड होता है, 'प्लेसहोल्डर' और एक अंतहीन स्पिनर दिखाता है। परिचित लगता है? अब कल्पना करें कि वही प्रोग्राम तुरंत खुलता है, बिना इंटरनेट के भी। रहस्य सही डेटा कैशिंग में है। और आज हम जानेंगे कि Kotlin में इसे कैसे लागू किया जाए ताकि आपका कोड न केवल तेज़ हो बल्कि सुरुचिपूर्ण भी हो।
\n\nKotlin एक ऐसी भाषा है जिसे संक्षिप्तता और सुरक्षा के लिए पसंद किया जाता है। लेकिन सबसे अच्छी भाषा में भी आप एक धीमा ऐप लिख सकते हैं यदि आप कैशिंग के बारे में नहीं सोचते। इस लेख में हम सरल in-memory कैश से लेकर Redis और DiskLruCache जैसे उन्नत समाधानों तक की यात्रा करेंगे। आप सीखेंगे कि Kotlin में डेटा को कैसे कैश करें ताकि उपयोगकर्ता लोडिंग के बारे में भूल जाएं, और सर्वर अनावश्यक अनुरोधों के बारे में भूल जाए।
\n\nKotlin में डेटा कैश क्यों करें?
\n\nकैशिंग एक अच्छी आदत की तरह है: पहले मुश्किल, फिर अपरिहार्य। यहाँ तीन कारण हैं कि आपके Kotlin ऐप को कैश की आवश्यकता क्यों है:
\n\n- \n
- गति: मेमोरी से डेटा माइक्रोसेकंड में पढ़ा जाता है, न कि सेकंड में जैसे सर्वर या डिस्क से। \n
- डेटा बचत: API के लिए कम अनुरोध - सर्वर और मोबाइल इंटरनेट पर कम खर्च। \n
- ऑफ़लाइन मोड: उपयोगकर्ता पसंद करते हैं जब ऐप बिना कनेक्शन के मेट्रो में भी काम करता है। \n
लेकिन एक बात है: गलत कैशिंग से मेमोरी लीक (OutOfMemoryError - अतीत से नमस्ते) या पुराना डेटा दिख सकता है। तो आइए जानें कि इसे सही तरीके से कैसे करें।
\n\nIn-memory कैश: Kotlin ऐप को तेज़ करने का सबसे सरल तरीका
\n\nचलिए बुनियादी से शुरू करते हैं - रैम में कैशिंग। यह आवश्यक उपकरणों को डेस्क पर रखने जैसा है, न कि हर बार गैरेज में दौड़ने जैसा।
\n\nसबसे सरल विकल्प HashMap या ConcurrentHashMap (यदि मल्टीथ्रेडिंग के साथ काम कर रहे हैं) का उपयोग करना है। लेकिन Kotlin में हम इसे और अधिक सुंदर बना सकते हैं:
class SimpleCache<K, V>(\n private val maxSize: Int = 100\n) {\n private val cache = LinkedHashMap<K, V>(0, 0.75f, true) // access-order\n\n fun get(key: K): V? {\n return cache[key]\n }\n\n fun put(key: K, value: V) {\n if (cache.size >= maxSize) {\n val oldest = cache.keys.firstOrNull()\n oldest?.let { cache.remove(it) }\n }\n cache[key] = value\n }\n\n fun clear() {\n cache.clear()\n }\n}\n\nयह कैश स्वचालित रूप से सबसे पुराने आइटम को हटा देता है जब सीमा पूरी हो जाती है। लेकिन एक समस्या है - यह डेटा की आयु को ध्यान में नहीं रखता। मान लीजिए, आपने मुद्रा दरों की सूची कैश की, और एक घंटे बाद दर बदल गई, लेकिन उपयोगकर्ता पुराना डेटा देखता है। अच्छा नहीं है।
\n\nTTL (Time To Live) जोड़ना
\n\ndata class CacheEntry<T>(\n val data: T,\n val expirationTime: Long\n)\n\nclass TTLCache<K, V>(\n private val ttlMillis: Long = 60_000, // 1 मिनट\n private val maxSize: Int = 100\n) {\n private val cache = LinkedHashMap<K, CacheEntry<V>>(0, 0.75f, true)\n\n fun get(key: K): V? {\n val entry = cache[key] ?: return null\n if (System.currentTimeMillis() > entry.expirationTime) {\n cache.remove(key)\n return null\n }\n return entry.data\n }\n\n fun put(key: K, value: V) {\n if (cache.size >= maxSize) {\n val oldest = cache.keys.firstOrNull()\n oldest?.let { cache.remove(it) }\n }\n cache[key] = CacheEntry(value, System.currentTimeMillis() + ttlMillis)\n }\n}\n\nअब डेटा ठीक उतने समय तक रहता है जितनी आवश्यकता है। API प्रतिक्रियाओं को कैश करने के लिए आदर्श जहां डेटा बार-बार नहीं बदलता (जैसे, उत्पाद श्रेणियों की सूची)।
\n\nAndroid में कैशिंग: DiskLruCache और Room
\n\nमोबाइल उपकरणों पर, मेमोरी एक सीमित संसाधन है। यदि आपका