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

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

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

ابدأ الدورة

مقدمة: لماذا نحتاج إلى التخزين المؤقت في Java؟



غالبًا ما تواجه تطبيقات Java الحديثة مشكلة في الأداء عند العمل مع قواعد البيانات أو واجهات API الخارجية أو العمليات الحسابية الثقيلة. كل طلب متكرر إلى مورد بطيء يزيد من وقت الاستجابة والعبء على البنية التحتية. حل هذه المشكلة هو التخزين المؤقت (Caching).



يسمح التخزين المؤقت في Java بتخزين البيانات المطلوبة بشكل متكرر مؤقتًا في مكان سريع الوصول (عادةً في الذاكرة العشوائية)، بحيث يتم إرجاعها فورًا عند الطلب المتكرر، متجاوزًا العمليات المكلفة. هذا أمر بالغ الأهمية للأنظمة عالية التحميل وتطبيقات الويب والخدمات المصغرة.



في هذه المقالة، سنقوم بتحليل ثلاثة مناهج رئيسية للتخزين المؤقت في Java: الحلول الموزعة (Redis, Memcached) و التخزين المؤقت المدمج (in-memory). ستتعرف على متى تختار أي أداة، وسترى أمثلة على الكود لكل منها.



1. التخزين المؤقت المدمج في Java: Ehcache, Caffeine و HashMap



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



1.1. أبسط ذاكرة تخزين مؤقت باستخدام HashMap (غير مناسبة للإنتاج)



أبسط طريقة هي استخدام ConcurrentHashMap. لكن هذا النهج لا يحتوي على آليات للتنظيف أو TTL (وقت الحياة) أو التحكم في الذاكرة.

import java.util.concurrent.ConcurrentHashMap;

public class SimpleCache<K, V> { private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();

public V get(K key) { return cache.get(key); }

public void put(K key, V value) { cache.put(key, value); }

public void evict(K key) { cache.remove(key); }}


العيوب: لا يوجد تنظيف تلقائي، قد يؤدي إلى OutOfMemoryError.



1.2. Caffeine — المعيار الحديث في Java



Caffeine هي مكتبة تخزين مؤقت عالية الأداء لـ Java 8+. تدعم التنظيف التلقائي بناءً على الوقت والحجم وتكرار الاستخدام.



import com.github.benmanes.caffeine.cache.Cache;import com.github.benmanes.caffeine.cache.Caffeine;import java.util.concurrent.TimeUnit;

public class CaffeineExample { public static void main(String[] args) { Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000) .build();

// كتابة cache.put("user:123", "John Doe");

// قراءة String user = cache.getIfPresent("user:123"); System.out.println("Cached user: " + user); }}


مزايا Caffeine: سرعة عالية، سياسة إزالة قابلة للتخصيص (LRU, LFU)، تحميل غير متزامن.



1.3. Ehcache — تم اختباره عبر الزمن



Ehcache هي واحدة من أقدم مكتبات التخزين المؤقت لـ Java. تدعم التخزين على القرص والتجميع (Clustering).



import org.ehcache.Cache;import org.ehcache.CacheManager;import org.ehcache.config.builders.CacheConfigurationBuilder;import org.ehcache.config.builders.CacheManagerBuilder;import org.ehcache.config.builders.ResourcePoolsBuilder;

public class EhcacheExample { public static void main(String[] args) { CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder( String.class, String.class, ResourcePoolsBuilder.heap(100))) .build(); cacheManager.init();

Cache<String, String> cache = cacheManager.getCache("m

المدونات

توصيات الكتب