مقدمة: لماذا تحتاج إلى التخزين المؤقت في Java؟
غالبًا ما تعمل تطبيقات Java الحديثة مع كميات كبيرة من البيانات. كل طلب إلى قاعدة البيانات أو API خارجي هو تكلفة من الوقت والموارد. بدون التخزين المؤقت، مع زيادة الحمل، ينخفض الأداء ويزداد وقت الاستجابة. يسمح التخزين المؤقت بتخزين البيانات المطلوبة بشكل متكرر في مكان سريع الوصول (في الذاكرة العشوائية)، مما يقلل من زمن الانتقال ويخفف الحمل على الواجهة الخلفية.
في Java، هناك ثلاثة أساليب رئيسية للتخزين المؤقت: الحلول المدمجة (مثل HashMap أو Caffeine)، الأنظمة الموزعة (Redis و Memcached). في هذه المقالة، سنشرح كلًا منها، ونقدم أمثلة على الكود، ونساعدك في اختيار الخيار الأمثل لمشروعك.
1. التخزين المؤقت المدمج في Java
التخزين المؤقت المدمج هو أبسط طريقة لتسريع التطبيق. يتم تخزين البيانات مباشرة في ذاكرة JVM. المزايا الرئيسية: الحد الأدنى من زمن الوصول للوصول، سهولة الإعداد. العيوب: سعة محدودة (تعتمد على heap)، فقدان البيانات عند إعادة تشغيل التطبيق.
1.1. التخزين المؤقت البسيط عبر HashMap
الخيار الأساسي هو استخدام ConcurrentHashMap مع إدارة يدوية لعمر البيانات. مناسب للنماذج الأولية، لكنه غير مناسب للإنتاج (لا يوجد تنظيف تلقائي، احتمالية تسرب الذاكرة).
import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.TimeUnit;
public class SimpleCache { private final ConcurrentHashMap<String, CacheEntry> cache = new ConcurrentHashMap<>();
public void put(String key, Object value, long ttlMillis) { cache.put(key, new CacheEntry(value, System.currentTimeMillis() + ttlMillis)); }
public Object get(String key) { CacheEntry entry = cache.get(key); if (entry == null || System.currentTimeMillis() > entry.expiry) { cache.remove(key); return null; } return entry.value; }
private static class CacheEntry { private final Object value; private final long expiry; // المُنشئ والدوال المساعدة }}1.2. Caffeine — مكتبة تخزين مؤقت حديثة
Caffeine هي مكتبة عالية الأداء لـ Java، تُستخدم افتراضيًا في Spring Cache. تدعم الإزالة التلقائية بناءً على الوقت والحجم، بالإضافة إلى العناصر الموزونة. تعمل Caffeine بشكل أسرع من Guava Cache (التي بُنيت عليها).
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 أو Ehcache (الذي يدعم التخزين على القرص). الحلول المدمجة مثالية للخدمات المصغرة والتطبيقات المتجانسة ذات النسخة الواحدة.
2. Memcached: تخزين مؤقت موزع لـ Java
Memcached هو نظام تخزين مؤقت موزع يعمل في الذاكرة العشوائية. إنه بسيط وسريع ويدعم التوسع الأفقي. الميزات الرئيسية:
- التخزين على شكل أزواج "مفتاح-قيمة" (الحد الأقصى لحجم القيمة هو 1 ميجابايت).
- لا يدعم الاستمرارية (تختفي البيانات عند إعادة التشغيل).
- لا يوجد مصادقة أو تشفير مدمج.
للعمل مع Memcached في Java، غالبًا ما تُستخدم مكتبة SpyMemcached أو
المدونات
توصيات الكتب
اقرأ أيضًا