परिचय: जावा में कैशिंग की आवश्यकता क्यों?
\nआधुनिक हाई-लोड डेवलपमेंट में डेटा तक पहुँच की गति एक महत्वपूर्ण कारक है। डेटाबेस या बाहरी API पर हर अनुरोध प्रतिक्रिया समय और इंफ्रास्ट्रक्चर पर लोड बढ़ाता है। जावा में कैशिंग आपको बार-बार अनुरोधित डेटा को तेज़ मेमोरी (RAM) में स्टोर करने की अनुमति देता है, जिससे प्रतिक्रिया समय दसियों मिलीसेकंड से घटकर माइक्रोसेकंड हो जाता है।
\nइस लेख में हम कैशिंग के तीन मुख्य दृष्टिकोणों पर चर्चा करेंगे: इन-बिल्ट सॉल्यूशंस (HashMap, Caffeine, Ehcache), Redis और Memcached। आप जानेंगे कि सही टूल कैसे चुनें और काम करने वाले कोड उदाहरण देखेंगे।
\n\n1. जावा में कैशिंग के लिए इन-बिल्ट सॉल्यूशंस
\nछोटे प्रोजेक्ट्स या सिंगल-थ्रेडेड एप्लिकेशन के लिए अक्सर इन-बिल्ट कलेक्शंस पर्याप्त होते हैं। हालांकि, प्रोडक्शन वातावरण के लिए विशेष लाइब्रेरीज़ का उपयोग करना बेहतर है।
\n\n1.1. HashMap पर सरल कैश
\nसबसे आसान तरीका है मैन्युअल टाइम-टू-लाइव (TTL) प्रबंधन के साथ ConcurrentHashMap का उपयोग करना। यह प्रोटोटाइप के लिए उपयुक्त है, लेकिन इसमें एविक्शन (eviction) तंत्र नहीं है।
import java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.TimeUnit;\n\npublic class SimpleCache {\n private final ConcurrentHashMap<String, CacheEntry> cache = new ConcurrentHashMap<>();\n\n public void put(String key, Object value, long ttlMs) {\n cache.put(key, new CacheEntry(value, System.currentTimeMillis() + ttlMs));\n }\n\n public Object get(String key) {\n CacheEntry entry = cache.get(key);\n if (entry == null || System.currentTimeMillis() > entry.expiry) {\n cache.remove(key);\n return null;\n }\n return entry.value;\n }\n\n private record CacheEntry(Object value, long expiry) {}\n}\n\n1.2. Caffeine — जावा के लिए हाई-परफॉरमेंस कैश
\nCaffeine एक आधुनिक लाइब्रेरी है जो Spring Cache में उपयोग होती है। यह समय, आकार और उपयोग आवृत्ति के आधार पर स्वचालित एविक्शन का समर्थन करती है।
\nimport com.github.benmanes.caffeine.cache.Cache;\nimport com.github.benmanes.caffeine.cache.Caffeine;\nimport java.util.concurrent.TimeUnit;\n\npublic class CaffeineExample {\n public static void main(String[] args) {\n Cache<String, String> cache = Caffeine.newBuilder()\n .expireAfterWrite(10, TimeUnit.MINUTES)\n .maximumSize(1000)\n .build();\n\n cache.put("user_1", "अलेक्से");\n String user = cache.getIfPresent("user_1");\n System.out.println(user); // अलेक्से\n }\n}\n\n1.3. Ehcache — एंटरप्राइज़ स्टैंडर्ड
\nEhcache एक परिपक्व समाधान है जो क्लस्टरिंग और डिस्क पर पर्सिस्टेंसी का समर्थन करता है। इसका उपयोग अक्सर Hibernate के साथ किया जाता है।
\nimport org.ehcache.Cache;\nimport org.ehcache.CacheManager;\nimport org.ehcache.config.builders.CacheConfigurationBuilder;\nimport org.ehcache.config.builders.CacheManagerBuilder;\nimport org.ehcache.config.builders.ResourcePoolsBuilder;\n\npublic class EhcacheExample {\n public static void main(String[] args) {\n CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()\n .withCache("users",\n CacheConfigurationBuilder.newCacheConfigurationBuilder(\n String.class, String.class,\n ResourcePoolsBuilder.heap(100))\n ).build();\n cacheManager.init();\n\n Cache<String, String> cache = cacheManager.getCache("users", String.class, String.class);\n cache.put("user_2", "मारिया");\n System.out.println(cache.get("user_2")); // मारिया\n\n cacheManager.close();\n }\n}\n\n2. Redis — जावा के लिए डिस्ट्रीब्यूटेड कैशिंग
\nRedis एक इन-मेमोरी डेटा स्टोर है जो एक अलग सर्वर के रूप में काम करता है। यह डिस्ट्रीब्यूटेड सिस्टम के लिए आदर्श है और डेटा को कई नोड्स पर सिंक्रोनाइज़ कर सकता है।