Redis والتخزين المؤقت المتقدم

مقدمة إلى التخزين المؤقت

18 دقيقة الدرس 1 من 30

ما هو التخزين المؤقت؟

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

مفهوم أساسي: التخزين المؤقت يستبدل الذاكرة بالسرعة. من خلال تخزين البيانات في طبقات تخزين أسرع، نحسن أداء التطبيق بشكل كبير.

لماذا نستخدم التخزين المؤقت؟

  • الأداء: تقليل أوقات الاستجابة من ثوان إلى ميلي ثانية
  • قابلية التوسع: التعامل مع مستخدمين أكثر بنفس البنية التحتية
  • خفض التكاليف: تقليل الحمل على قاعدة البيانات واستدعاءات API
  • التوافر: تقديم المحتوى المخزن مؤقتاً حتى لو كانت خدمات الواجهة الخلفية بطيئة أو متوقفة
  • تجربة المستخدم: الصفحات الأسرع تؤدي إلى مستخدمين أكثر سعادة ومشاركة أفضل
// بدون التخزين المؤقت - استعلام قاعدة بيانات بطيء في كل مرة\n$products = DB::table('products')->where('featured', true)->get();\n\n// مع التخزين المؤقت - استعلام قاعدة البيانات مرة واحدة فقط، ثم يتم تقديمه من الذاكرة المؤقتة\n$products = Cache::remember('featured_products', 3600, function() {\n return DB::table('products')->where('featured', true)->get();\n});

أنواع التخزين المؤقت

1. التخزين المؤقت للمتصفح (Browser Caching)

يقوم متصفح الويب بتخزين الأصول الثابتة (CSS، JavaScript، الصور) محلياً على جهاز المستخدم. يتم التحكم فيه بواسطة رؤوس HTTP مثل Cache-Control و ETag.

// تعيين رؤوس الذاكرة المؤقتة في Laravel\nreturn response($content)\n ->header('Cache-Control', 'public, max-age=86400');

2. التخزين المؤقت لـ CDN

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

3. التخزين المؤقت على مستوى التطبيق/الخادم

يقوم خادم التطبيق بتخزين النتائج المحسوبة واستعلامات قاعدة البيانات والعروض المُقدمة مؤقتاً. هذا هو المكان الذي يعمل فيه Redis و Memcached.

4. التخزين المؤقت لاستعلامات قاعدة البيانات

قاعدة البيانات نفسها تخزن نتائج الاستعلام وخطط التنفيذ مؤقتاً. ذاكرة استعلام MySQL المؤقتة، المخازن المؤقتة المشتركة لـ PostgreSQL.

5. التخزين المؤقت للكائنات

تخزين كائنات أو بنيات بيانات كاملة في الذاكرة، مما يسمح باسترجاع البيانات المعقدة دون إعادة بناء.

إصابة الذاكرة المؤقتة مقابل فقدانها

فهم هذه المفاهيم أمر بالغ الأهمية لأداء الذاكرة المؤقتة:

  • إصابة الذاكرة المؤقتة (Cache Hit): تم العثور على البيانات المطلوبة في الذاكرة المؤقتة - استرجاع سريع
  • فقدان الذاكرة المؤقتة (Cache Miss): البيانات المطلوبة غير موجودة في الذاكرة المؤقتة - يجب الجلب من مصدر بطيء
  • نسبة الإصابة: نسبة الطلبات التي يتم تقديمها من الذاكرة المؤقتة (كلما زادت كانت أفضل)
هدف التحسين: تعظيم إصابات الذاكرة المؤقتة من خلال تخزين البيانات التي يتم الوصول إليها بشكل متكرر مع أوقات انتهاء صلاحية مناسبة.
// مثال: سيناريو إصابة الذاكرة المؤقتة\n1. المستخدم يطلب المنتج #123\n2. التحقق من الذاكرة المؤقتة لـ 'product:123'\n3. تم العثور عليه في الذاكرة المؤقتة! (CACHE HIT) - الإرجاع في 0.5 ميلي ثانية\n\n// مثال: سيناريو فقدان الذاكرة المؤقتة\n1. المستخدم يطلب المنتج #456\n2. التحقق من الذاكرة المؤقتة لـ 'product:456'\n3. غير موجود في الذاكرة المؤقتة (CACHE MISS)\n4. استعلام قاعدة البيانات - يستغرق 50 ميلي ثانية\n5. تخزين النتيجة في الذاكرة المؤقتة للمرة القادمة\n6. الإرجاع للمستخدم

فوائد التخزين المؤقت

  1. تقليل زمن الوصول: الوصول إلى الذاكرة أسرع بـ 100 مرة من القرص/قاعدة البيانات
  2. تقليل حمل قاعدة البيانات: استعلامات أقل تعني أن قواعد البيانات يمكنها التعامل مع المزيد من الزيارات
  3. الحماية من حدود معدل API: تخزين استجابات API الخارجية مؤقتاً لتجنب الوصول إلى الحدود
  4. تحسين الموثوقية: تقديم ذاكرة مؤقتة قديمة إذا فشلت الواجهة الخلفية (تدهور رشيق)
  5. توفير التكاليف: تقليل الحاجة إلى توسيع قاعدة البيانات المكلف

متى لا نستخدم التخزين المؤقت

التخزين المؤقت ليس دائماً الحل الصحيح. تجنب التخزين المؤقت في هذه السيناريوهات:

لا تخزن مؤقتاً:
  • البيانات الديناميكية للغاية: البيانات التي تتغير في كل طلب (على سبيل المثال، أسعار الأسهم في الوقت الفعلي)
  • البيانات الحساسة الخاصة بالمستخدم: المعلومات الشخصية التي يجب أن تكون جديدة وآمنة
  • الوصول منخفض التردد: البيانات التي نادراً ما يتم الوصول إليها لا تستفيد من التخزين المؤقت
  • اتساق البيانات أمر بالغ الأهمية: عندما يمكن أن تسبب البيانات القديمة مشاكل خطيرة (المعاملات المالية)
  • مكاسب أداء صغيرة: إذا كانت العملية الأصلية سريعة بالفعل (<10 ميلي ثانية)

استراتيجيات إبطال الذاكرة المؤقتة

المشكلة الأصعب في علوم الكمبيوتر: معرفة متى تتم إزالة أو تحديث البيانات المخزنة مؤقتاً.

  • المستندة إلى الوقت (TTL): تنتهي صلاحية الذاكرة المؤقتة بعد X ثوان/دقائق/ساعات
  • المستندة إلى الحدث: إبطال الذاكرة المؤقتة عند تغيير البيانات الأساسية
  • يدوي: مسح الذاكرة المؤقتة بشكل صريح عند الحاجة
  • LRU (الأقل استخداماً مؤخراً): إزالة العناصر الأقدم غير المستخدمة تلقائياً عندما تكون الذاكرة المؤقتة ممتلئة
// انتهاء الصلاحية المستند إلى الوقت\nCache::put('key', $value, 3600); // تنتهي الصلاحية في ساعة واحدة\n\n// الإبطال المستند إلى الحدث\nProduct::updated(function($product) {\n Cache::forget('product:' . $product->id);\n});

أفضل ممارسات التخزين المؤقت

  1. خزن مؤقتاً البيانات التي يكلف حسابها أو استرجاعها
  2. استخدم قيم TTL مناسبة بناءً على تقلب البيانات
  3. راقب نسب إصابة الذاكرة المؤقتة واضبط الاستراتيجية وفقاً لذلك
  4. امتلك استراتيجية إبطال الذاكرة المؤقتة منذ اليوم الأول
  5. فكر في تسخين الذاكرة المؤقتة للبيانات الحرجة
  6. استخدم مفاتيح ذاكرة مؤقتة وصفية ومُسماة
  7. نفذ آليات احتياطية لفشل الذاكرة المؤقتة
تمرين: حدد ثلاث صفحات في تطبيقك ستستفيد من التخزين المؤقت. لكل صفحة، حدد:
  • ما البيانات التي يجب تخزينها مؤقتاً؟
  • كم من الوقت يجب تخزينها مؤقتاً؟
  • ما الحدث الذي يجب أن يبطل الذاكرة المؤقتة؟
  • ما هو الاحتياطي إذا فشلت الذاكرة المؤقتة؟

في الدرس التالي، سنغوص في Redis، أحد أشهر وأقوى حلول التخزين المؤقت المتاحة اليوم.