تكرار السؤال: …
الإجابة المختصرة
تفحص Cache::remember وجود المفتاح؛ فإن وجدته أعادته، وإلا نفذت دالة الـ Closure وحفظت الناتج بالمدة المحددة، بينما تضمن الأقفال الذرية عدم تنفيذ عملية ثقيلة إلا بواسطة طلب واحد فقط.
الشرح
تعد Cache::remember النمط الأكثر شيوعاً لتخزين نتائج الاستعلامات البطيئة. ومع ذلك، عند انتهاء مدة المفتاح في موقع يستقبل آلاف الزيارات، قد تحاول مئات الطلبات في نفس اللحظة إعادة حساب نفس النتيجة والتواصل مع قاعدة البيانات معاً (ظاهرة Cache Stampede). استخدام Cache::lock()->get() يضمن أن طلباً واحداً فقط هو من يقوم بالتحديث بينما تنتظر باقي الطلبات النتيجة الجاهزة.
مثال بالكود
$users = Cache::remember('users.active', now()->addHours(1), function () {
return User::where('active', true)->get();
});أخطاء شائعة
- تخزين كائنات نماذج Eloquent ضخمة بعلاقات غير محملة في الكاش مما يسبب أخطاء Serialization.
أسئلة متابعة
- ما هي خوارزمية انتهاء الصلاحية المبكر الاحتمالي (Probabilistic Early Expiration) لمقاومة تدافع الكاش؟
- ما هي أوامر تحسين الأداء الأساسية (route:cache, view:cache, config:cache) في بيئة الإنتاج؟