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

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

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

ابدأ الدورة

مقدمة في التخزين المؤقت باستخدام Kotlin

في التطوير الحديث باستخدام Kotlin، غالبًا ما يعتمد أداء التطبيقات على سرعة الوصول إلى البيانات. التخزين المؤقت هو تقنية تخزين مؤقت للبيانات المطلوبة بشكل متكرر في مخزن سريع، مما يسمح بتقليل وقت الاستجابة وتخفيف الحمل على قواعد البيانات أو واجهات API الخارجية. لمطوري Kotlin، هناك ثلاثة أساليب رئيسية متاحة: استخدام الأنظمة الخارجية Redis و Memcached، بالإضافة إلى الحلول المدمجة (in-memory cache).

في هذه المقالة، سنقوم بتحليل كل منها بالتفصيل، وسنقدم أمثلة عملية على كود Kotlin ونساعدك في اختيار الخيار الأمثل لمشروعك. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يسعون لتحسين تطبيقاتهم.



1. التخزين المؤقت المدمج في Kotlin (In-Memory)

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



1.1. تخزين مؤقت بسيط باستخدام HashMap

مثال أساسي — استخدام ConcurrentHashMap لتخزين البيانات:

import java.util.concurrent.ConcurrentHashMap

class SimpleCache<K, V> { private val cache = ConcurrentHashMap<K, V>()

fun get(key: K): V? = cache[key]

fun put(key: K, value: V) { cache[key] = value }

fun remove(key: K) = cache.remove(key)

fun clear() = cache.clear()}

// مثال على الاستخدامfun main() { val cache = SimpleCache<String, String>() cache.put("user:1", "Alice") println(cache.get("user:1")) // الإخراج: Alice}

هذا الأسلوب بسيط، لكنه لا يدعم الحذف التلقائي للبيانات القديمة (TTL) وقد يؤدي إلى تسرب الذاكرة.



1.2. تخزين مؤقت متقدم باستخدام Caffeine

Caffeine هي مكتبة عالية الأداء للتخزين المؤقت على JVM، وهي مناسبة تمامًا لـ Kotlin. تدعم TTL، والإخلاء التلقائي، والإحصائيات.

import com.github.benmanes.caffeine.cache.Caffeineimport java.util.concurrent.TimeUnit

fun main() { val cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) // TTL 10 دقائق .maximumSize(100) // الحد الأقصى 100 إدخال .recordStats() // تفعيل الإحصائيات .build<String, String>()

cache.put("session:123", "token_abc") println(cache.getIfPresent("session:123")) // الإخراج: token_abc

// إحصائيات الاستخدام val stats = cache.stats() println("الإصابات: ${stats.hitCount()}, الإخفاقات: ${stats.missCount()}")}

التخزين المؤقت المدمج مناسب تمامًا للخيوط المفردة أو الخدمات المصغرة الصغيرة حيث لا تكون المزامنة بين مثيلات التطبيق المتعددة مطلوبة.



2. التخزين المؤقت باستخدام Redis في Kotlin

Redis هو مخزن بيانات في الذاكرة (in-memory) يُستخدم غالبًا كذاكرة تخزين مؤقت موزعة. يدعم هياكل بيانات معقدة (سلاسل، قوائم، تجزئات، مجموعات) ويحتوي على آليات مدمجة لـ TTL والثبات (persistence).



2.1. توصيل Redis بـ Kotlin

للعمل مع Redis في Kotlin، غالبًا ما تُستخدم مكتبة Lettuce (غير متزامنة) أو Jedis (متزامنة). لنلقِ نظرة على مثال باستخدام Jedis:

// build.gradle.ktsdependencies {    implementation("redis.clients:jedis:5.1.0")}

import redis.clients.jedis.JedisPooled

fun main() { val jedis = JedisPooled("localhost", 6379)

// تعيين قيمة مع TTL لمدة 60 ثانية jedis.setex("user:42", 60, "Bob")

// الحصول على القيمة val user = jedis.get("user:42") println("المستخدم: $user") // الإخراج: المستخدم: Bob

// استخدام التجزئات jedis.hset("user:42:profile", mapOf( "n

المدونات

توصيات الكتب