أنماط التخزين المؤقت وانتهاؤه
طبّقوا نمط cache-aside وعيّنوا أوقات الانتهاء
أنماط التخزين المؤقت وانتهاؤه درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
أنماط التخزين المؤقت
تُسمّى الطريقة التي تقرؤون بها من ذاكرة التخزين المؤقت وتكتبون فيها نمطًا. وأكثر الأنماط شيوعًا في تطبيقات الويب هو cache-aside، حيث يدير كودكم ذاكرة التخزين المؤقت حول مصدر البيانات.
نمط Cache-Aside
يعمل Cache-aside، أو التحميل الكسول، في ثلاث خطوات: فحص ذاكرة التخزين المؤقت؛ وعند عدم العثور على القيمة، تحميلها من المصدر وإضافتها إلى ذاكرة التخزين المؤقت؛ ثم إعادة القيمة. وتمتلئ ذاكرة التخزين المؤقت عند الطلب.
async Task<string> GetForecastAsync(string city)
{
string key = $"forecast:{city}";
string cached = await _cache.GetStringAsync(key);
if (cached is not null) return cached;
string fresh = await _api.LoadForecastAsync(city);
await _cache.SetStringAsync(key, fresh);
return fresh;
}لماذا يُعد انتهاء الصلاحية ضروريًا
قد تصبح البيانات المخزّنة مؤقتًا قديمة. يعمل انتهاء الصلاحية على إزالة الإدخالات تلقائيًا بعد مدة معينة، بحيث تعيد القراءة التالية تحميل بيانات حديثة، محققًا توازنًا بين الأداء وقِدم البيانات.
انتهاء الصلاحية المطلق
يُزيل انتهاء الصلاحية المطلق الإدخال عند وقت محدد، بصرف النظر عن مدى استخدامه. استخدموه عندما تكون البيانات صالحة خلال فترة زمنية معروفة فقط.
var options = new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
};انتهاء الصلاحية المنزلق
يعيد انتهاء الصلاحية المنزلق ضبط المؤقت عند كل وصول. ويبقى الإدخال ما دام يُستخدم بانتظام، لكنه يُزال بعد مرور مدة من عدم النشاط. وهذا مناسب جدًا للبيانات الشبيهة ببيانات الجلسات.
var options = new DistributedCacheEntryOptions
{
SlidingExpiration = TimeSpan.FromMinutes(5)
};الجمع بين النوعين
يمكنكم تعيين كليهما: إذ يحافظ الانتهاء المنزلق على بقاء البيانات كثيرة الاستخدام، بينما يضمن الحد المطلق ألا يبقى الإدخال أكثر من مدة قصوى، ما يفرض تحديثه في النهاية.
var options = new DistributedCacheEntryOptions
{
SlidingExpiration = TimeSpan.FromMinutes(5),
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
};تطبيق الخيارات عند التخزين
مرّروا الخيارات بوصفها الوسيط الثالث إلى SetStringAsync أو SetAsync حتى يحمل الإدخال سياسة انتهاء الصلاحية الخاصة به.
await _cache.SetStringAsync(key, fresh, options);الكتابة المباشرة وإبطال الصلاحية
عند تغيّر بيانات المصدر، أزيلوا البيانات من ذاكرة التخزين المؤقت أو حدّثوها حتى لا تعيد القراءات قيمًا قديمة. وعادةً ما يقترن Cache-aside بعمليات الكتابة من خلال استدعاء RemoveAsync للمفتاح المتأثر.
await _repository.UpdateForecastAsync(city, value);
await _cache.RemoveAsync($"forecast:{city}");تجنب تدافع ذاكرة التخزين المؤقت
إذا انتهت صلاحية مفتاح شائع، فقد تعيد طلبات كثيرة تحميله في الوقت نفسه، وهذا ما يُسمى التدافع. خففوا ذلك باستخدام أقفال قصيرة، أو مدد انتهاء صلاحية عشوائية قليلًا، أو تحديث في الخلفية، بحيث يعيد طلب واحد فقط بناء الإدخال.
اختيار مدد انتهاء الصلاحية
اختاروا المدد بناءً على معدل تغيّر البيانات ومقدار القِدم المقبول. تتحمل البيانات المرجعية مدد TTL طويلة، بينما تحتاج البيانات سريعة التغير إلى مدد قصيرة أو إلى إبطال قائم على الأحداث.
تكلفة عدم العثور على القيمة
تتطلب كل حالة عدم العثور على القيمة تحميلًا من المصدر، لذلك صمّموا المفاتيح ومدد TTL لزيادة معدل العثور على القيم إلى أقصى حد. راقبوا نسب العثور على القيم وعدم العثور عليها لضبط ذاكرة التخزين المؤقت بمرور الوقت.
اختبار سريع
اختبروا أنماط التخزين المؤقت وانتهاء الصلاحية.
مراجعة
يفحص نمط cache-aside ذاكرة التخزين المؤقت، ويحمّل القيمة عند عدم العثور عليها، ثم يضيفها إلى الذاكرة. يزيل انتهاء الصلاحية المطلق الإدخال عند وقت ثابت، بينما يعيد انتهاء الصلاحية المنزلق ضبطه عند الوصول؛ ويمكنكم الجمع بينهما باستخدام DistributedCacheEntryOptions. أَبطلوا الصلاحية عند الكتابة باستخدام RemoveAsync، واحموا التطبيق من التدافع، واضبطوا مدد TTL والمفاتيح وفق أنماط الوصول ومقدار القِدم المقبول.
الأسئلة الشائعة
هل درس «أنماط التخزين المؤقت وانتهاؤه» مجاني؟
نعم — نص درس «أنماط التخزين المؤقت وانتهاؤه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط التخزين المؤقت وانتهاؤه»؟
طبّقوا نمط cache-aside وعيّنوا أوقات الانتهاء تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أنماط التخزين المؤقت وانتهاؤه»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تجريد IDistributedCache
- الاتصال بـ Redis
- أنماط التخزين المؤقت وانتهاؤه
- تخزين الكائنات المتسلسلة مؤقتًا