التخزين المؤقت في Kotlin: Redis وMemcached والحلول المدمجة من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التخزين المؤقت في Kotlin: Redis وMemcached والحلول المدمجة: من الألف إلى الياء

\n\n

تتطلب التطبيقات الحديثة بلغة Kotlin سرعة استجابة عالية ومعالجة فعالة للبيانات. إحدى الأدوات الرئيسية لتحقيق هذا الهدف هي التخزين المؤقت. في هذه المقالة، سنناقش ثلاثة أساليب: استخدام Redis وMemcached والحلول المدمجة على مستوى JVM. ستتعلم كيفية اختيار الاستراتيجية الصحيحة، وستحصل على أمثلة جاهزة للكود للتكامل مع مشروعك.

\n\n

1. التخزين المؤقت المدمج في Kotlin (ذاكرة التخزين المؤقت داخل التطبيق)

\n\n

أبسط طريقة هي استخدام ذاكرة تخزين مؤقت داخل التطبيق. في Kotlin (التي تعمل على JVM)، يمكنك استخدام المجموعات القياسية أو المكتبات المتخصصة مثل Caffeine أو Guava Cache.

\n\n

مثال مع Caffeine (موصى به)

\n

أضف التبعية في build.gradle.kts:

\n
implementation("com.github.ben-manes.caffeine:caffeine:3.1.8")
\n\n

أنشئ خدمة تخزين مؤقت:

\n
import com.github.benmanes.caffeine.cache.Cache\nimport com.github.benmanes.caffeine.cache.Caffeine\nimport java.util.concurrent.TimeUnit\n\nclass UserCache {\n    private val cache: Cache<String, User> = Caffeine.newBuilder()\n        .expireAfterWrite(10, TimeUnit.MINUTES)\n        .maximumSize(1000)\n        .build()\n\n    fun getUser(id: String): User? = cache.getIfPresent(id)\n\n    fun putUser(id: String, user: User) {\n        cache.put(id, user)\n    }\n}
\n\n

الإيجابيات: زمن انتقال ضئيل، لا حاجة لاستدعاءات الشبكة، سهولة الإعداد.
\nالسلبيات: فقدان التخزين المؤقت عند إعادة تشغيل التطبيق، محدود بحجم ذاكرة JVM.

\n\n

2. التخزين المؤقت مع Redis في Kotlin

\n\n

Redis هو مخزن قوي في الذاكرة يدعم هياكل بيانات معقدة. مثالي للأنظمة الموزعة.

\n\n

الإعداد عبر Spring Data Redis

\n

أضف التبعية:

\n
implementation("org.springframework.boot:spring-boot-starter-data-redis")\nimplementation("org.jetbrains.kotlin:kotlin-reflect")
\n\n

الإعداد (application.yml):

\n
spring:\n  redis:\n    host: localhost\n    port: 6379\n    timeout: 2000ms\n    lettuce:\n      pool:\n        max-active: 8\n        max-idle: 4
\n\n

مثال لخدمة مع تعليقات Spring Cache:

\n
import org.springframework.cache.annotation.Cacheable\nimport org.springframework.stereotype.Service\n\n@Service\nclass ProductService {\n\n    @Cacheable("products", key = "#id")\n    fun getProduct(id: Long): Product {\n        println("تحميل من قاعدة البيانات: $id")\n        return Product(id, "المنتج $id")\n    }\n}
\n\n

للعمل مع Redis مباشرة (بدون Spring):

\n
import io.lettuce.core.RedisClient\nimport io.lettuce.core.api.sync.RedisCommands\n\nclass RedisCache {\n    private val commands: RedisCommands<String, String>\n\n    init {\n        val client = RedisClient.create("redis://localhost:6379")\n        commands = client.connect().sync()\n    }\n\n    fun set(key: String, value: String, ttlSeconds: Long = 300) {\n        commands.setex(key, ttlSeconds, value)\n    }\n\n    fun get(key: String): String? = commands.get(key)\n}
\n\n

الإيجابيات: تخزين مؤقت موزع، استمرارية البيانات، دعم TTL والهياكل المعقدة.
\nالسلبيات: يتطلب خادمًا منفصلاً، زمن انتقال أعلى قليلاً (استدعاء شبكة).

\n\n

3. التخزين المؤقت مع Memcached في Kotlin

\n\n

Memcached هو مخزن موزع خفيف الوزن، محسّن لتخزين الكائنات الصغيرة في الذاكرة.

\n\n

التوصيل عبر مكتبة xmemcached

\n

أضف في build.gradle.kts:

\n
implementation("com.googlecode.xmemcached:xmemcached:2.4.8")
\n\n

مثال على الاستخدام:

\n
import net.rubyeye.xmemcached.MemcachedClient\nimport net.rubyeye.xmemcached.XMem                

المدونات

توصيات الكتب