Kotlin में कैशिंग: Redis, Caffeine और विकल्प
\n\nकैशिंग अनुप्रयोगों के प्रदर्शन को बढ़ाने के लिए प्रमुख उपकरणों में से एक है। Kotlin में, Java के साथ संगतता और JVM के समृद्ध पारिस्थितिकी तंत्र के कारण, कई समाधान उपलब्ध हैं: हल्के in-memory कैश से लेकर Redis पर आधारित वितरित सिस्टम तक। इस लेख में, हम लोकप्रिय लाइब्रेरी, उनके कॉन्फ़िगरेशन और उपयोग के उदाहरणों पर चर्चा करेंगे।
\n\nकैशिंग की आवश्यकता क्यों है?
\nकैशिंग के मुख्य उद्देश्य:
\n- \n
- तेज़ मेमोरी में बार-बार अनुरोधित डेटा को संग्रहीत करके प्रतिक्रिया समय (latency) को कम करना। \n
- डेटाबेस और बाहरी API पर लोड कम करना। \n
- दोहराए जाने वाले अनुरोधों पर कम्प्यूटेशनल संसाधनों की बचत करना। \n
Kotlin मूल Java लाइब्रेरी और विशेष Kotlin रैपर दोनों का उपयोग करने की अनुमति देता है।
\n\n1. Lettuce या Redisson के माध्यम से Redis
\nRedis वितरित कैशिंग के लिए सबसे लोकप्रिय in-memory data store है। Kotlin में, इसे Lettuce (रिएक्टिव) या Redisson (सिंक्रोनस/एसिंक्रोनस) क्लाइंट के माध्यम से जोड़ा जाता है।
\n\nउदाहरण: Lettuce के साथ कैशिंग
\n// build.gradle.kts\nimplementation("io.lettuce:lettuce-core:6.3.1.RELEASE")\n\n// CacheService.kt\nimport io.lettuce.core.RedisClient\nimport io.lettuce.core.api.sync.RedisCommands\n\nclass RedisCache(private val host: String = "localhost", private val port: Int = 6379) {\n private val client: RedisClient = RedisClient.create("redis://$host:$port")\n private val connection = client.connect()\n private val sync: RedisCommands<String, String> = connection.sync()\n\n fun get(key: String): String? = sync.get(key)\n fun set(key: String, value: String, ttlSeconds: Long = 60) {\n sync.setex(key, ttlSeconds, value)\n }\n fun delete(key: String) = sync.del(key)\n fun close() {\n connection.close()\n client.shutdown()\n }\n}\n\n// उपयोग\nfun main() {\n val cache = RedisCache()\n cache.set("user:123", """{"name":"Alice","role":"admin"}""", 120)\n val data = cache.get("user:123")\n println(data) // {"name":"Alice","role":"admin"}\n cache.close()\n}\n\nRedisson — उच्च-स्तरीय API
\nimplementation("org.redisson:redisson:3.27.2")\n\nval config = Config().apply {\n useSingleServer().setAddress("redis://127.0.0.1:6379")\n}\nval redisson = Redisson.create(config)\nval map = redisson.getMap<String, String>("userCache")\nmap["user:456"] = """{"name":"Bob"}"""\nval bob = map["user:456"]\nredisson.shutdown()\n\n2. Caffeine — तेज़ in-memory कैश
\nCaffeine Guava Cache का आधुनिक विकल्प है। यह उच्च लोड के लिए अनुकूलित है और पुरानी प्रविष्टियों को स्वचालित रूप से हटाने का समर्थन करता है।
\n\nimplementation("com.github.ben-manes.caffeine:caffeine:3.1.8")\n\nimport com.github.benmanes.caffeine.cache.Cache\nimport com.github.benmanes.caffeine.cache.Caffeine\nimport java.util.concurrent.TimeUnit\n\nval cache: Cache<String, String> = Caffeine.newBuilder()\n .expireAfterWrite(10, TimeUnit.MINUTES)\n .maximumSize(10_000)\n .recordStats()\n .build()\n\n// लेखन और पढ़ना\ncache.put("key1", "value1")\nval value = cache.getIfPresent("key1")\nprintln(value) // value1\n\n// सांख्यिकी\nval stats = cache.stats()\nprintln("Hit rate: ${stats.hitRate()}")\n\n3. Hazelcast — क्लस्टरिंग के साथ वितरित कैश
\nHazelcast माइक्रोसर्विस आर्किटेक्चर के लिए उपयुक्त है: कैश स्वचालित रूप से नोड्स के बीच सिंक्रोनाइज़ होता है।
\n\nimplementation("com.hazelcast:hazelcast:5.3.6")\n\nimport com.hazelcast.core.Hazelcast\nimport com.hazelcast.map.IMap\n\nval instance = Hazelcast.newHazelcastInstance()\nval map: IMap<String, String> = instance.getMap("session-cache")\nmap.put("session:token123", "userId=42", 30, TimeUnit.MINUTES)\nval userId = map.get("session:token123")\ninstance.shutdown()\n\n