التخزين المؤقت في Java باستخدام Caffeine

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

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

ابدأ الدورة

ما هو Caffeine؟

Caffeine هي مكتبة عالية الأداء للتخزين المؤقت بلغة Java، تم تطويرها مع مراعاة المتطلبات الحديثة للسرعة والكفاءة. توفر تخزينًا مؤقتًا في الذاكرة (in-memory cache) مع دعم العمليات غير المتزامنة، والإزالة التلقائية للسجلات حسب الوقت أو الحجم، بالإضافة إلى سياسات إزالة قابلة للتخصيص (مثل تلك القائمة على تكرار الاستخدام). المكتبة متوافقة تمامًا مع Java 8 والإصدارات الأحدث، وتُستخدم بنشاط في المشاريع الكبيرة مثل Spring Framework (عبر Spring Cache).

لماذا نحتاجها؟

يسمح التخزين المؤقت بتقليل وقت الوصول إلى البيانات، وتخفيف الحمل على قواعد البيانات أو واجهات API الخارجية، وزيادة استجابة التطبيق. تحل Caffeine هذه المهام بأقل قدر من الحمل الإضافي (overhead): فهي توفر تأخيرات دون الميكروثانية للقراءة والكتابة، وتدير الذاكرة تلقائيًا، وتسمح بضبط التخزين المؤقت بمرونة وفقًا لمتطلبات العمل المحددة. بدونها، سيتعين عليك تنفيذ التخزين المؤقت يدويًا باستخدام HashMap والمؤقتات، وهو أمر معقد وغير موثوق.

التثبيت

أضف التبعية (dependency) إلى ملف pom.xml الخاص بك (Maven):

<dependency>    <groupId>com.github.ben-manes.caffeine</groupId>    <artifactId>caffeine</artifactId>    <version>3.1.8</version></dependency>

لـ Gradle:

implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'

الوظائف الرئيسية

  • الإزالة التلقائية: حذف السجلات بناءً على وقت البقاء (expireAfterWrite, expireAfterAccess) أو بناءً على الحجم (maximumSize, maximumWeight).
  • التحميل غير المتزامن: عبر AsyncCache أو طرق loadingCache مع دعم CompletableFuture.
  • الإحصائيات: جمع المقاييس (معدل الإصابة، معدل الخطأ، عمليات الإزالة) للمراقبة.
  • سياسات الإزالة: بشكل افتراضي، يُستخدم Window TinyLFU (خوارزمية تكيفية قريبة من المثالية).
  • الأمان من القيم الفارغة (Null-safety): معالجة صحيحة للقيم الفارغة (null).

مثال على كود Java

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(100) .recordStats() .build();

// كتابة في التخزين المؤقت cache.put("user:123", "Alice");

// قراءة مع تحميل تلقائي String user = cache.get("user:456", key -> fetchFromDatabase(key)); System.out.println(user); // null أو نتيجة fetch

// إحصائيات System.out.println(cache.stats().hitRate()); }

private static String fetchFromDatabase(String key) { return "Bob"; // محاكاة لطلب إلى قاعدة البيانات }}

متى تستخدم

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

توصيات