الكاش بيحتفظ بنسخة من نتيجة علشان متحسبهاش أو تجيبها من مصدرها كل مرة ده ممكن يحسن سرعة الاستجابة لكن لو مش محدد إمتى النسخة تتغير ممكن المستخدم يشوف سعر قديم أو بيانات تخص شخص تاني
حدد إيه اللي مكلف الأول
ابدأ بقياس وقت العملية وعدد مرات تكرارها متضيفش Cache لكل حاجة من غير سبب قائمة عامة قليلة التغيير تختلف عن رصيد بيتغير باستمرار وقرار صلاحية لازم يعكس الوضع الحالي
المفتاح لازم يوصف النتيجة
لو النتيجة بتختلف حسب اللغة أو الصفحة أو المستخدم فلازم التصميم يميز الحالات دي متخزنش صفحة شخصية تحت مفتاح عام يستخدمه كل الزوار
function catalogKey(language, page) {
return "catalog:v1:" + language + ":page:" + page;
}
console.log(catalogKey("en", 1));
console.log(catalogKey("ar", 1));
console.log(catalogKey("en", 2));catalog:v1:en:page:1
catalog:v1:ar:page:1
catalog:v1:en:page:2مدة الصلاحية مش تحديث فوري
ال TTL اختصار Time To Live وهي مدة صلاحية النسخة لو المدة خمس دقايق فده مش معناه إن تعديل البيانات هيظهر فور الحفظ ممكن النسخة القديمة تفضل لحد انتهاء المدة
اسأل إيه التأخير المقبول لكل نوع بيانات ومين هيلاحظ الخطأ لو اتعرضت نسخة قديمة
وقت التعديل محتاج خطة
ممكن تحذف المفتاح المرتبط بعد نجاح الحفظ أو تحدث النسخة أو تستخدم رقم إصدار للمفتاح المهم إن التغيير في قاعدة البيانات والكاش ميتعارضوش
في وجود معاملات نفذ الإبطال بعد نجاح Commit ومع التزامن راجع احتمال إن عملية قراءة بدأت قبل التعديل وترجع تنشر نسخة قديمة بعده القفل أو الإصدارات ممكن يكونوا جزء من الحل
مثال للفكرة داخل Laravel
المثال التالي داخل تطبيق Laravel بيخزن عدد المنتجات المنشورة لمدة دقيقة بافتراض وجود Model اسمه Product وحقل is_published راجع مكان إبطال المفتاح لما النشر يتغير
<?php
use Illuminate\Support\Facades\Cache;
use App\Models\Product;
$count = Cache::remember('published-products:count:v1', 60, function () {
return Product::where('is_published', true)->count();
});كاش المتصفح غير كاش التطبيق
ممكن تمسح كاش التطبيق وتفضل شايف استجابة قديمة من المتصفح أو CDN راجع طبقة التخزين اللي بتتعامل معاها بدل افتراض إن كل كاش واحد
في HTTP ال no-cache بتسمح بالتخزين مع إعادة التحقق قبل إعادة الاستخدام أما no-store فبتطلب عدم تخزين الاستجابة و private بتمنع التخزين في كاش مشترك لكنها مش بديل عن تسجيل الدخول والصلاحيات
متخزنش قرار صلاحية قديم وتعتبره حقيقة
لو اشتراك المستخدم انتهى أو حسابه اتوقف فقرار السماح لازم يتحدث حسب سياسة التطبيق ممكن تخزن بيانات عامة لكن وصول المستخدم لمحتوى خاص لازم يفضل محمي عند الطلب
اختبر بعد التعديل مش قبل التعديل بس
اعرض البيانات علشان يتكون كاش ثم عدلها وافتح الصفحة بحسابين ولغتين مختلفتين وجرب انتهاء المدة وفشل مصدر البيانات راقب عدد مرات الوصول للمصدر علشان تعرف إن الكاش فعلا بيخدم الهدف
متستخدمش مسح كل الكاش كحل دائم لكل مشكلة استهدف المفتاح المرتبط وخلي عندك طريقة تفهم بيها النسخة اتكونت إمتى وليه لسه موجودة