الكاش بيحتفظ بنسخة من نتيجة علشان متحسبهاش أو تجيبها من مصدرها كل مرة ده ممكن يحسن سرعة الاستجابة لكن لو مش محدد إمتى النسخة تتغير ممكن المستخدم يشوف سعر قديم أو بيانات تخص شخص تاني

حدد إيه اللي مكلف الأول

ابدأ بقياس وقت العملية وعدد مرات تكرارها متضيفش 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 بتمنع التخزين في كاش مشترك لكنها مش بديل عن تسجيل الدخول والصلاحيات

متخزنش قرار صلاحية قديم وتعتبره حقيقة

لو اشتراك المستخدم انتهى أو حسابه اتوقف فقرار السماح لازم يتحدث حسب سياسة التطبيق ممكن تخزن بيانات عامة لكن وصول المستخدم لمحتوى خاص لازم يفضل محمي عند الطلب

اختبر بعد التعديل مش قبل التعديل بس

اعرض البيانات علشان يتكون كاش ثم عدلها وافتح الصفحة بحسابين ولغتين مختلفتين وجرب انتهاء المدة وفشل مصدر البيانات راقب عدد مرات الوصول للمصدر علشان تعرف إن الكاش فعلا بيخدم الهدف

متستخدمش مسح كل الكاش كحل دائم لكل مشكلة استهدف المفتاح المرتبط وخلي عندك طريقة تفهم بيها النسخة اتكونت إمتى وليه لسه موجودة

مصادر للتوسع