जावा में कैशिंग: Redis, Memcached और इन-बिल्ट समाधान: उन्नत स्तर
\n\nकैशिंग Java अनुप्रयोगों के प्रदर्शन और स्केलेबिलिटी को बढ़ाने के लिए प्रमुख उपकरणों में से एक है। उन्नत स्तर पर, डेवलपर को वितरित सिस्टम (Redis, Memcached) और हल्के इन-बिल्ट कैश (Caffeine, Guava) के बीच चयन करना होता है। इस लेख में, हम आर्किटेक्चरल अंतर, उपयोग के परिदृश्यों का विश्लेषण करेंगे और प्रत्येक समाधान के लिए व्यावहारिक कोड उदाहरण प्रस्तुत करेंगे।
\n\n1. इन-बिल्ट कैश: Caffeine और Guava
\n\nइन-बिल्ट कैश JVM के अंदर काम करते हैं और उन्हें बाहरी सेवाओं की आवश्यकता नहीं होती है। वे अस्थायी डेटा को संग्रहीत करने के लिए आदर्श हैं जिन्हें नोड्स के बीच सिंक्रनाइज़ करने की आवश्यकता नहीं है।
\n\nCaffeine — आधुनिक मानक
\nCaffeine Java में कैशिंग के लिए एक उच्च-प्रदर्शन लाइब्रेरी है, जिसने Guava Cache को बदल दिया है। यह प्रभावी एंट्री निष्कासन के लिए Window TinyLFU एल्गोरिदम का उपयोग करता है।
\n\n// Maven निर्भरता\n// <dependency>\n// <groupId>com.github.ben-manes.caffeine</groupId>\n// <artifactId>caffeine</artifactId>\n// <version>3.1.8</version>\n// </dependency>\n\nimport com.github.benmanes.caffeine.cache.Cache;\nimport com.github.benmanes.caffeine.cache.Caffeine;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class CaffeineExample {\n public static void main(String[] args) {\n Cache<String, User> userCache = Caffeine.newBuilder()\n .expireAfterWrite(10, TimeUnit.MINUTES)\n .maximumSize(10_000)\n .recordStats()\n .build();\n\n // लिखना\n userCache.put("user:123", new User("Alice", "alice@example.com"));\n\n // पढ़ना\n User user = userCache.getIfPresent("user:123");\n System.out.println("Cached user: " + user);\n\n // लोडिंग के साथ परमाणु पढ़ना\n User result = userCache.get("user:456", key -> loadUserFromDB(key));\n }\n\n private static User loadUserFromDB(String key) {\n // DB से लोडिंग का अनुकरण\n return new User("Bob", "bob@example.com");\n }\n\n static class User {\n private final String name;\n private final String email;\n\n User(String name, String email) {\n this.name = name;\n this.email = email;\n }\n\n @Override\n public String toString() {\n return "User{name='" + name + "', email='" + email + "'}";\n }\n }\n}\n\n\nGuava Cache — सिद्ध समाधान
\nGoogle का Guava Cache उन परियोजनाओं के लिए एक लोकप्रिय विकल्प बना हुआ है जो पहले से ही Guava लाइब्रेरी का उपयोग कर रहे हैं। यह विभिन्न निष्कासन रणनीतियों और श्रोताओं का समर्थन करता है।
\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\n\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\n\npublic class GuavaCacheExample {\n public static void main(String[] args) throws ExecutionException {\n LoadingCache<String, String> cache = CacheBuilder.newBuilder()\n .expireAfterAccess(5, TimeUnit.MINUTES)\n .maximumSize(5000)\n .removalListener(notification -> \n System.out.println("Removed: " + notification.getKey()))\n .build(new CacheLoader<String, String>() {\n @Override\n public String load(String key) {\n return "Computed: " + key.toUpperCase();\n }\n });\n\n // लिखना\n cache.put("key1", "value1");\n\n // स्वचालित लोडिंग के साथ पढ़ना\n String value = cache.get("key2");\n System.out.println(value); // "Computed: KEY2"\n }\n}\n\n\n2. Redis के साथ वितरित कैशिंग
\n\nRedis एक