التخزين المؤقت في Kotlin: Redis وأدوات أخرى لتسريع التطبيقات
التخزين المؤقت هو أحد الآليات الرئيسية لتحسين أداء التطبيقات الحديثة. في نظام Kotlin البيئي (كما في Java) تتوفر عدة مكتبات قوية لتنظيم التخزين المؤقت: من الحلول البسيطة في الذاكرة إلى الأنظمة الموزعة القائمة على Redis. في هذه المقالة، سنستعرض الأدوات الشائعة وإعداداتها وأمثلة على استخدامها بلغة Kotlin.
لماذا نحتاج إلى التخزين المؤقت؟
يسمح التخزين المؤقت بتقليل وقت استجابة التطبيق وتخفيف الحمل على قاعدة البيانات وواجهات API الخارجية. السيناريوهات الرئيسية:
- الاستعلامات المتكررة لنفس البيانات (مثل القواميس والإعدادات)؛
- العمليات الحسابية طويلة الوقت (توليد التقارير والتجميعات المعقدة)؛
- العمل مع الخدمات الخارجية (الحد من معدل الطلبات وتأخيرات الشبكة).
1. Redis — التخزين المؤقت الموزع
Redis هو مخزن بيانات في الذاكرة يُستخدم غالبًا كذاكرة تخزين مؤقت موزعة. في نظام Kotlin/Java البيئي، العملاء الرئيسيون هم Lettuce وJedis. بالنسبة لـ Spring Boot، يُوصى باستخدام spring-boot-starter-data-redis.
مثال على دمج Redis مع Kotlin وSpring Boot
// build.gradle.ktsimplementation("org.springframework.boot:spring-boot-starter-data-redis")implementation("org.springframework.boot:spring-boot-starter-cache")
// application.ymlspring: cache: type: redis redis: host: localhost port: 6379
// خدمة مع التخزين المؤقت@Serviceclass UserService(private val userRepository: UserRepository) {
@Cacheable("users") fun getUserById(id: Long): User { // محاكاة استعلام طويل Thread.sleep(2000) return userRepository.findById(id).orElseThrow() }
@CacheEvict("users", key = "#id") fun deleteUser(id: Long) { userRepository.deleteById(id) }}التعليمة @Cacheable تحفظ النتيجة تلقائيًا في Redis، بينما @CacheEvict تحذف الإدخال عند تغيير البيانات.
2. Caffeine — ذاكرة تخزين مؤقت عالية الأداء في الذاكرة
Caffeine هي مكتبة حديثة للتخزين المؤقت المحلي، تتفوق بشكل كبير على Guava Cache من حيث السرعة والوظائف. وهي مثالية للهياكل أحادية الخيط أو المعمارية الدقيقة.
إعداد Caffeine في Kotlin
// التبعيةimplementation("com.github.ben-manes.caffeine:caffeine:3.1.8")
// إنشاء ذاكرة التخزين المؤقتval cache: Cache<String, User> = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000) .recordStats() .build()
// الاستخدامfun getUser(id: String): User { return cache.get(id) { key -> // دالة التحميل إذا كان المفتاح غير موجود userRepository.findById(key).orElseThrow() }}
// الحصول على الإحصائياتprintln("Hit rate: ${cache.stats().hitRate()}")يدعم Caffeine التفريغ التلقائي للسجلات القديمة (انتهاء الصلاحية بعد الكتابة/الوصول)، وحد الحجم، وجمع الإحصائيات للمراقبة.
3. Ehcache — حل ناضج مع دعم التخزين على القرص
Ehcache هي واحدة من أقدم مكتبات التخزين المؤقت لـ Java. تدعم التخزين متعدد المستويات (heap, off-heap, disk) والتجميع. بالنسبة لـ Kotlin، يُستخدم API Java القياسي.
مثال مع Ehcache 3 وإعداد XML
// التبعيةimplementation("org.ehcache:ehcache:3.10.8")
// الإعداد (ehcache.xml)<config xmlns="http://www.ehcache.org/v3"> <cache alias="users"> <key-type>java.lang.Long</key-type> <value-type>com.example.User</value-type> <resources> <heap unit="entries">100</heap> <offheap unit="MB">10</offheap> </res