ما هو التخزين المؤقت (Caching)؟ دليل بسيط لبناة التطبيقات
التخزين المؤقت يعني الاحتفاظ بنسخة جاهزة من شيء كان بطيئاً أو مكلفاً الحصول عليه، بحيث يمكن الإجابة على الطلب التالي له سريعاً من تلك النسخة. تُسمى النسخة المحفوظة ذاكرة مؤقتة (cache). يخزّن متصفحك الصور حتى يفتح الموقع بسرعة في زيارتك الثانية، ويخزّن الخادم نتيجة استعلام قاعدة بيانات بطيء حتى لا ينفذه لكل زائر.
التخزين المؤقت يجعل التطبيقات أسرع وأرخص في التشغيل. ومقايضته الكبرى أن النسخة قد تصبح قديمة.
لماذا يهم التخزين المؤقت عند البناء بالذكاء الاصطناعي؟
ستصادف التخزين المؤقت في التطبيقات المبنية بالذكاء الاصطناعي بثلاث طرق:
- «حدّثت التطبيق لكني ما زلت أرى النسخة القديمة.» هذه أكثر حالات التخزين المؤقت شيوعاً، وغالباً ما تكون غير ضارة، فمتصفحك أو شبكة CDN تعرض نسخة محفوظة.
- السرعة. إذا كانت صفحة بطيئة لأنها تعيد حساب الأرقام نفسها لكل زائر، فتخزين النتيجة قد يجعلها تبدو فورية.
- التكلفة. كثير من أدوات البناء والاستضافة تفرض رسوماً على الحوسبة ووقت قاعدة البيانات واستدعاءات APIs الخارجية. إذا أطلق ألف زائر الطلب المكلف نفسه، فالتخزين المؤقت يتيح لك دفع ثمنه مرة واحدة.
معرفة الأساسيات تتيح لك طلب التخزين المؤقت حيث يفيد، والتعرف عليه حين يكون سبب ظهور شيء بشكل خاطئ.
تشبيه من الحياة اليومية
فكّر في مطبخ مقهى مزدحم.
يمكن للطاهي أن يحضّر كل قهوة من حبوب طازجة عند طلبها، وهذا بطيء. لذلك يحتفظ بإبريق من القهوة المفلترة جاهزاً على الموقد. معظم الزبائن يحصلون على فنجانهم خلال ثوانٍ، وهذا إصابة في الذاكرة (cache hit). وعندما ينفد الإبريق، يُحضَّر إبريق جديد، وهذا إخفاق في الذاكرة (cache miss).
لكن القهوة التي تبقى طويلاً تفسد، لذلك للمقهى قاعدة: يُتخلص من أي إبريق عمره أكثر من 30 دقيقة. هذه القاعدة هي مدة الصلاحية للذاكرة. لا أحد يحتفظ بالإبريق نفسه طوال اليوم، ولا أحد يحضّر مسبقاً طلباً مخصصاً بحليب الشوفان وثلاث ملاعق سكر، فبعض الأشياء لا يجب تخزينها أصلاً.
أين توجد الذواكر المؤقتة؟
قد يمر تحميل صفحة واحدة عبر عدة ذواكر، من الأقرب للمستخدم إلى الأبعد:
| الذاكرة | مكانها | ما تخزّنه عادةً | مثال |
|---|---|---|---|
| ذاكرة المتصفح | على جهاز الزائر | الصور وملفات التنسيق والسكربتات والخطوط | شعارك يظهر فوراً في الصفحة الثانية |
| ذاكرة CDN | خوادم حول العالم، قريبة من الزوار | الملفات الثابتة وأحياناً صفحات كاملة | زائر في طوكيو يحصل على الملفات من خادم قريب، لا من خادمك الأصلي |
| ذاكرة التطبيق | على الخادم أو بجانبه، غالباً في الذاكرة أو Redis | نتائج الاستعلامات البطيئة أو استدعاءات APIs الخارجية | أسعار الصرف لهذا اليوم، تُجلب مرة كل ساعة |
| ذاكرة قاعدة البيانات | داخل قاعدة البيانات | البيانات المستخدمة مؤخراً وخطط الاستعلامات | الصفوف الشائعة تبقى في الذاكرة السريعة |
شبكة CDN (شبكة توصيل المحتوى) هي في جوهرها شبكة عالمية من الذواكر لملفات موقعك.
كيف تقرر الذاكرة ما تحتفظ به؟
كل ذاكرة يجب أن تجيب عن الأسئلة نفسها:
- ما الذي يمكن تخزينه؟ البيانات العامة والمشتركة (صورة منتج، مقال مدونة): نعم. البيانات الخاصة (صفحة حساب المستخدم، رسائله): لا تُخزَّن أبداً في ذاكرة مشتركة.
- لأي مدة؟ هذا هو TTL (زمن البقاء). شعار قد يُخزَّن لسنة، ومستوى مخزون قد يُخزَّن 30 ثانية.
- كيف يتم تحديثه؟ إما أن تنتهي النسخة فتُجلب من جديد، أو يحذفها التطبيق عمداً عندما تتغير البيانات الأصلية، وهذا يسمى الإبطال (invalidation).
بالنسبة لمواقع الويب، يخبر الخادم المتصفحات وشبكات CDN كيف تخزّن كل ملف عبر ترويسة Cache-Control. على سبيل المثال، تعني Cache-Control: max-age=3600 «يمكنك إعادة استخدام هذه النسخة لمدة ساعة».
أدوات البناء الحديثة تتولى الجزء الأصعب للملفات الثابتة عبر كسر الذاكرة (cache busting): كلما تغيّر ملف يحصل على اسم جديد يحمل بصمة، مثل app.3f9a2c.js. يمكن للمتصفحات تخزين الاسم القديم لفترة طويلة، لأن النسخة الجديدة ببساطة لها اسم مختلف.
مثال عملي: كتالوج منتجات
لديك متجر إلكتروني صغير. تعرض الصفحة الرئيسية 50 منتجاً مع أسعارها ومستويات مخزونها من قاعدة البيانات، إضافة إلى قائمة «الأكثر رواجاً» تتطلب حساباً بطيئاً عبر كل الطلبات.
- الصور والسكربتات تُخزَّن في ذاكرة المتصفح وCDN لمدة طويلة. كل بناء جديد يعطي الملفات المتغيرة أسماء جديدة، فتظل التحديثات تظهر.
- قائمة الأكثر رواجاً تُحسب مرة كل 10 دقائق وتُخزَّن في ذاكرة التطبيق. كل زائر خلال تلك الدقائق العشر يحصل على النتيجة المحفوظة فوراً.
- الأسعار تُخزَّن لمدة قصيرة، وتُمسح الذاكرة كلما عدّلت منتجاً، فلا يرى العملاء سعراً قديماً لوقت طويل.
- المخزون عند الدفع لا يُخزَّن أبداً. عندما يضغط أحدهم «اشترِ»، يتحقق التطبيق من قاعدة البيانات الحقيقية، فلا يستطيع بيع صنف نفد للتو.
- صفحات السلة والحساب لا تُخزَّن أبداً في الذواكر المشتركة، لأنها شخصية.
النتيجة: الصفحة الرئيسية سريعة، وقاعدة البيانات تعمل أقل بكثير، ولا شيء يتعلق بالمال أو الخصوصية يصبح قديماً.
مصطلحات أساسية
| المصطلح | المعنى |
|---|---|
| Cache hit / miss (إصابة / إخفاق) | وُجدت البيانات في الذاكرة / احتاجت إلى جلبها من المصدر. |
| TTL (زمن البقاء) | المدة التي تُعتبر فيها النسخة المحفوظة حديثة. |
| Stale data (بيانات قديمة) | نسخة محفوظة لم تعد محدّثة. |
| Invalidation (الإبطال) | حذف نسخة محفوظة عمداً لأن الأصل تغيّر. |
| Cache busting (كسر الذاكرة) | تغيير اسم الملف أو رابطه عند تغيّره، حتى تجلب الذواكر النسخة الجديدة. |
| Cache-Control | ترويسة HTTP تخبر المتصفحات وشبكات CDN كيف تخزّن الرد. |
| Hard refresh (التحديث الكامل) | إعادة تحميل الصفحة مع إخبار المتصفح بتجاهل ذاكرته. |
| Redis | مخزن بيانات شائع في الذاكرة، يُستخدم غالباً كذاكرة تطبيق. |
مفاهيم خاطئة شائعة
- «التخزين المؤقت دائماً مفيد.» تخزين الشيء الخطأ يسبب أخطاء حقيقية: أسعار قديمة، أو منشورات جديدة لا تظهر، أو الأسوأ، صفحة خاصة بمستخدم تظهر لمستخدم آخر. خزّن بقصد ومدروس.
- «إذا رأيت النسخة القديمة فالتحديث فشل.» غالباً لم يفشل. جرّب التحديث الكامل (Ctrl+Shift+R، أو Cmd+Shift+R على Mac) أو نافذة التصفح الخاص قبل أن تفترض وجود عطل.
- «التخزين المؤقت يصلح تطبيقاً بطيئاً.» إنه يخفي البطء للطلبات المتكررة. الطلب الأول ما زال بطيئاً، وإذا كانت المشكلة الأساسية فهرساً ناقصاً في قاعدة البيانات، فأصلح ذلك أيضاً.
- «يجب تخزين كل شيء أطول مدة ممكنة.» المدد الطويلة تناسب الملفات التي تحصل على أسماء جديدة عند تغيّرها. أما صفحات HTML والبيانات فالمدد القصيرة أأمن.
- «مسح ذاكرتي يصلح الأمر للجميع.» إنه يمسح ذاكرة متصفحك فقط. الزوار وذواكر CDN ما زالت لديها نسخها الخاصة.
ماذا تسأل أداة البناء بالذكاء الاصطناعي؟
- «أي أجزاء من هذا التطبيق بطيئة، وأيها يمكن تخزينه بأمان؟»
- «خزّن [قائمة الأكثر رواجاً / نتيجة الـ API] لمدة [N] دقيقة، وامسحها عند تغيّر البيانات الأصلية.»
- «تأكد من أن أي صفحة تحتوي بيانات شخصية أو بيانات حساب لا يمكن لشبكة CDN أو أي ذاكرة مشتركة تخزينها.»
- «اضبط مدداً طويلة للملفات الثابتة ذات البصمات، ومدداً قصيرة لصفحات HTML.»
- «خزّن الردود من [API خارجي] حتى لا نستدعيه عند كل تحميل صفحة، وأخبرني بمدى احتمال قِدم هذه البيانات.»
- «أرى نسخة قديمة بعد النشر. هل هي ذاكرة متصفحي، أم أن شيئاً لم يُنشر؟»
التخزين المؤقت في Mythex
بعد نشر تحديث لتطبيق Mythex، توضح الوثائق أن ذواكر CDN قد تتأخر لفترة قصيرة، وأن التحديث الكامل للرابط العام يعرض النسخة الجديدة. انظر كيفية النشر. كما توصي صفحة حدود الاستضافة بتخزين الملفات الثابتة مؤقتاً، لأن الاستضافة ووقت قاعدة البيانات وعرض النطاق تُدفع من رصيد أرصدتك. أما ما يتجاوز ذلك، كتخزين نتائج الاستعلامات أو ردود الـ API، فهو شيء تطلب من الوكيل بناءه في تطبيقك.
قراءات ذات صلة: ما هي شبكة CDN، وكيف تجعل موقعك أسرع، وما هو تحديد المعدل (rate limiting).
الأسئلة
ما هو التخزين المؤقت بعبارات بسيطة؟
التخزين المؤقت يعني حفظ نسخة من شيء كان بطيئاً أو مكلفاً الحصول عليه، بحيث يمكن تقديمه بسرعة من النسخة المحفوظة في المرة التالية التي يُحتاج فيها. تستخدم المتصفحات وشبكات CDN والخوادم وقواعد البيانات ذواكر مؤقتة لجعل التطبيقات أسرع وأرخص في التشغيل.
لماذا ما زلت أرى النسخة القديمة من موقعي بعد تحديثه؟
من المحتمل أن متصفحك أو شبكة CDN تعرض نسخة محفوظة من الملفات القديمة. عادةً ما يحل التحديث الكامل المشكلة (Ctrl+Shift+R على Windows، أو Cmd+Shift+R على Mac). أما بالنسبة للزوار، فالمواقع الجيدة تعطي الملفات المحدَّثة أسماء جديدة، فتجلب الذواكر النسخة الجديدة تلقائياً.
ماذا يفعل مسح الذاكرة المؤقتة؟
يحذف مسح ذاكرة المتصفح النسخ المحفوظة من الملفات والصفحات، فيُنزَّل كل شيء من جديد في المرة القادمة. وقد يصلح الصفحات التي تبدو معطلة أو قديمة، لكن الصفحات تحمّل أبطأ قليلاً في المرة الأولى بعد ذلك.
هل يمكن أن يسبب التخزين المؤقت مشاكل؟
نعم. الخطر الأساسي هو تقديم بيانات قديمة، كسعر قديم أو مخزون غير محدَّث، أو الأسوأ: تخزين صفحة خاصة بمستخدم وعرضها لشخص آخر. قواعد التخزين الجيدة تحدد ما الذي يمكن تخزينه ولأي مدة، ولا تخزّن البيانات الشخصية أبداً في الذواكر المشتركة.