ذاكرة التخزين المؤقت لقرص نظام الملفات الثابتة لـ ASP.NET

ملخص: https://www.codeproject.com/articles/12097/cache-management-in-asp-net
استخدم مصطلحات مختلفة لشرح نفس المفهوم ، أي إدارة البيانات. يشير بعض الأشخاص إلى ذلك على أنه إدارة الدولة ويشير البعض الآخر إلى إدارة ذاكرة التخزين المؤقت. أنا أحب كلمة "ذاكرة التخزين المؤقت". ولكن من الناحية المفاهيمية ، لا يوجد فرق بين هذين.
الآن دعونا نناقش الجوانب المختلفة لإدارة ذاكرة التخزين المؤقت (أو إدارة الدولة) في ASP.NET.
على الرغم من أن إدارة ذاكرة التخزين المؤقت ليست مشكلة في تطبيقات Windows ، إلا أنها كانت دائمًا يمثل تحديًا في بيئة الويب. نظرًا لأن HTTP عبارة عن بروتوكول عديمي الجنسية ولا يتعرف خادم الويب على المستخدمين بين الطلبات المختلفة ، يصبح من المهم للغاية بالنسبة لنا التعرف على مستخدم معين بين الطلبات المختلفة وأيضًا تخزين البيانات بحيث يمكن إعادة استخدامه بين الطلبات المختلفة. يوفر ASP.NET العديد من الميزات لتخزين البيانات في كل من العميل (المتصفح) وجوانب الخادم (خادم الويب) ، ولكن في بعض الأحيان نشعر بالارتباك مع متى نستخدم ما. في ASP.NET ، نواجه ميزات مثل كائنات الجلسة والتطبيق وذاكرة التخزين المؤقت ، ولكن من المهم بالنسبة لنا أن نفهم الفرق بينهما من أجل استخدامها بفعالية في تطبيقات الويب.
في هذه المقالة ، سوف أتطرق إلى خيارات إدارة ذاكرة التخزين المؤقت المختلفة المتاحة في ASP.NET. في تطبيق ويب ، في بعض الأحيان نطلب تخزين البيانات في جانب الخادم لتجنب عملية استرجاع البيانات المكلفة من مخازن البيانات ومنطق تنسيق البيانات المستهلكة للوقت لتحسين أداء التطبيق وكذلك إعادة استخدام نفس البيانات في الطلبات اللاحقة عبر المستخدمين والتطبيقات والآلات. لذلك ، لتحقيق ذلك ، نحتاج إلى تخزين البيانات (ذاكرة التخزين المؤقت) في جانب الخادم.
يساعدنا التخزين المؤقت في تحقيق ثلاثة جوانب مهمة من جودة الخدمة (جودة الخدمة):
يوفر ASP.NET كائنًا يسمى كائن التطبيق لتخزين البيانات التي يمكن الوصول إليها لجميع طلبات المستخدم. يتم ربط فترة العمر لهذا الكائن بالتطبيق ويتم إعادة إنشائها في كل مرة يبدأ فيها التطبيق. على عكس كائن جلسة ASP.NET ، يمكن الوصول إلى هذا الكائن لجميع طلبات المستخدمين. نظرًا لأن هذا التخزين يتم إنشاؤه وصيانته في مساحة مجال التطبيق ، فلا ينبغي استخدام هذا لتخزين البيانات في سيناريو مزرعة الويب. يعد هذا الخيار مفيدًا للغاية لتخزين البيانات مثل بيانات تعريف التطبيق (بيانات ملفات التكوين) التي يمكن تحميلها إلى كائن التطبيق أثناء بدء تشغيل التطبيق ويمكن استخدامه أثناء عمر التطبيق دون إعادة تحميله في كل مرة لكل طلب مستخدم. ولكن إذا كان هناك شرط لإبطال البيانات المخزنة مؤقتًا كلما كان هناك أي تغيير في ملفات التكوين أثناء تشغيل التطبيق ، فيجب عدم استخدام هذا الخيار لأنه لا يوفر أي ميزة لإنهاء صلاحية البيانات المخزنة مؤقتًا. لذلك في هذه الحالة ، يجب استخدام خيارات أخرى مثل كائن ذاكرة التخزين المؤقت ASP.NET ، وهو موضح أدناه.
يوفر ASP.NET كائن زوج القيمة المفاتيح - كائن ذاكرة التخزين المؤقت المتوفرة في مساحة الاسم System.Web.Caching. نطاقه هو مجال التطبيق وترتبط فترة العمر بالتطبيق. على عكس كائن جلسة ASP.NET ، يمكن الوصول إلى هذا الكائن لجميع طلبات المستخدمين.
على الرغم من أن كل من كائنات التطبيق وذاكرة التخزين المؤقت تبدو كما هي ، فإن الفرق الرئيسي بينهما هو الميزات المضافة التي يوفرها كائن ذاكرة التخزين المؤقت مثل سياسات انتهاء الصلاحية والتبعيات. وهذا يعني أنه يمكن انتهاء صلاحية/إزالة البيانات المخزنة في كائن ذاكرة التخزين المؤقت بناءً على بعض الوقت المحدد مسبقًا من قبل رمز التطبيق أو عندما يتم تغيير الكيان التابع في حين أن هذه الميزة غير متوفرة في كائن التطبيق.
دعونا نناقش سياسات انتهاء الصلاحية المختلفة والتبعيات المدعومة.
التبعية تعني أنه يمكن إزالة عنصر من ذاكرة التخزين المؤقت عندما يتم تغيير كيان تابع. لذلك يمكن تعريف العلاقة التابعة على عنصر تعتمد إزالته من ذاكرة التخزين المؤقت على المعال. هناك نوعان من التبعيات المدعومة في ASP.NET.
مثال: دعنا نقول في طلبي ، أنا أستخدم ملف XML لتخزين تفاصيل الخطأ (رقم الخطأ ورسم رسائل الخطأ) والذي يتم استخدامه لاسترداد رسالة خطأ للحصول على رقم خطأ معين في وقت التشغيل. لذا ، بدلاً من قراءة الملف من القرص في كل مرة أحتاج فيها إلى رسالة خطأ ، لنفترض أنني قررت تحميله مرة واحدة عند بدء تشغيل التطبيق وتخزينه في ذاكرة التخزين المؤقت ASP.NET لمزيد من الاستخدام. لذا ، إذا كنت بحاجة إلى تغيير ملف التكوين لإضافة رسائل خطأ جديدة أو تغيير بعض رسائل الخطأ الموجودة أثناء تشغيل التطبيق ، فماذا سيحدث لبياني المخبأة؟ هل أحتاج إلى إيقاف التطبيق وبدءه مرة أخرى لتعكس تغييرات الملف في التطبيق؟ الجواب لا. يمكن إبطال بيانات ذاكرة التخزين المؤقت عندما يتغير الملف باستخدام خيار تبعية الملف.
تحدد سياسة انتهاء الصلاحية سياسة كيف ومتى يجب انتهاء صلاحية عنصر في ذاكرة التخزين المؤقت.
يشارك كائن Singleton Remoting .NET Remoting نفس الحالة مع العديد من العملاء ، بحيث يمكن استخدام كائنات Singleton لتخزين البيانات ومشاركتها بين دعوات العملاء المختلفة. نظرًا لأنه يمكن استخدام Remoting .NET خارج العملية والآلة ، يكون هذا الخيار مفيدًا للغاية عندما نريد تخزين البيانات ومشاركتها عبر الخوادم والمستخدمين وخاصة في سيناريو مزرعة الويب. في هذا النهج ، يمكننا تخزين البيانات كمتغيرات أعضاء لكائن Singleton عن بعد وتوفير طرق لقراءة البيانات وحفظها. ولكن أثناء تنفيذ ذلك ، نحتاج إلى التأكد من عدم تدمير الكائن البعيد المستخدم كذاكرة التخزين المؤقت من قبل جامع القمامة. لذلك ، سيتعين علينا ضبط فترة الإيجار لكائن ذاكرة التخزين المؤقت عن بُعد على Infinite بحيث لا تمر فترة الإيجار أبدًا. يمكننا القيام بذلك عن طريق تجاوز طريقة initializelifetimeservice لـ MarshalByRefObject وإعادة Null من هذه الطريقة. لكن المشكلة الوحيدة في هذا النهج هي الأداء. كما يقول التحليل ، فإن الأداء ضعيف للغاية في هذا النهج بالمقارنة مع الأساليب الأخرى. على أي حال ، الأمر متروك لمصممي/مطوري التطبيق لتحليل الخيارات المختلفة واستخدام أفضل الخيار الذي يناسب المتطلبات.
تعرفون جميعًا ما هو ملف تم تصنيفه للذاكرة. يتعلق الأمر بشكل أساسي بتخطيط ملف على القرص إلى مجموعة محددة من العناوين في مساحة عنوان عملية التطبيق. يتيح هذا الخيار عمليات مختلفة لاستخدام نفس البيانات عن طريق زيادة أداء التطبيق. نظرًا لأن استخدام الملف الذي تم تعيينه للذاكرة لا يحظى بشعبية كبيرة بين مطوري .NET ، فإنني لا أقترح شخصيًا هذا النهج لأن تنفيذ هذا ينطوي على الكثير من التعقيدات وأيضًا .NET Framework لا يدعم هذا. ولكن إذا كان أي شخص مهتمًا جدًا باستخدام هذا النهج ، فسيتعين عليهم تطوير حلهم المخصص وفقًا لمتطلباتهم الخاصة.
نستخدم متغيرات ثابتة لتخزين البيانات أو الكائنات على مستوى العالم بحيث يمكن الوصول إليها أثناء عمر التطبيق. وبالمثل ، في ASP.NET ، يمكننا استخدام كائنات ثابتة لتخزين بيانات التخزين المؤقت ويمكننا أيضًا توفير طرق لاسترداد وحفظ البيانات إلى ذاكرة التخزين المؤقت. نظرًا لأن المتغيرات الثابتة يتم تخزينها في منطقة العملية ، فسيكون الأداء أسرع. ولكن نظرًا لأنه من الصعب للغاية تنفيذ سياسات وتبعي الصلاحية في حالة وجود متغيرات ثابتة ، فأنا أفضل عمومًا كائن ذاكرة التخزين المؤقت ASP.NET على هذا الخيار. مشكلة أخرى هي أن كائن ذاكرة التخزين المؤقت الثابتة المخصصة يجب أن يكون آمنًا لرسائل الخيط والذي يجب تنفيذه بعناية.
يمكننا أيضًا استخدام قاعدة بيانات لتخزين البيانات ومشاركة البيانات عبر المستخدمين والآلات. هذا النهج مفيد للغاية عندما نريد تخزين كميات كبيرة من البيانات. إن استخدام هذا النهج لتخزين كمية صغيرة من البيانات ليس فكرة جيدة بسبب الأداء. لتخزين كمية صغيرة من البيانات ، يجب أن نذهب إلى آليات التخزين المؤقت في ASP.NET الأخرى. نظرًا لأن البيانات تحتاج إلى تخزين في قاعدة بيانات ، فإن جميع الكائنات تحتاج إلى تسلسل XML بحيث يكون تخزينها واستردادها أسهل. يمكننا أيضًا استخدام أنواع أخرى من تنسيقات التسلسل المتاحة في إطار .NET.
في بعض الأحيان في تطبيقنا ، في بعض الصفحات ، لا يتغير الإخراج عمومًا لفترة زمنية محددة. على سبيل المثال ، في موقع الويب الخاص بالموارد البشرية ، لا تتغير تفاصيل راتب الموظف بشكل متكرر وتتغير مرة واحدة فقط في الشهر. بشكل عام ، يتغير فقط في اليوم الأول من كل شهر. لذلك خلال شهر واحد ، ستعرض صفحة تفاصيل الراتب نفس التفاصيل لموظف معين. لذلك في هذه الحالة ، أليس من الجيد تخزين الصفحة في مكان ما في الخادم لتجنب معالجة حساب الأعمال والمكالمات إلى قاعدة البيانات وتقديم الصفحة في كل مرة يريد الموظف رؤية تفاصيل راتبه. في رأيي ، نعم! إنها فكرة جيدة جدًا. لتحقيق ذلك ، يوفر ASP.NET ميزة لتخزين إخراج صفحة في الخادم لفترة زمنية محددة. كما يوفر ميزات لتخزين جزء من الصفحة المعروفة باسم تخزين Page Pragment.
في بعض الأحيان ، قد نحتاج إلى تخزين بيانات أو صفحات في جانب العميل لتحسين أداء التطبيق. يؤدي استخدام هذه الآلية إلى تقليل الحمل على الخادم ولكن هذه الآلية لديها بعض مشكلات الأمان حيث نخدع البيانات في جانب العميل.
ملف تعريف الارتباط هو تخزين من جانب العميل يتم إرساله إلى الخادم لكل طلب ، كما يتم استلامه كاستجابة من الخادم. بسبب الحد من الحجم ، يجب استخدامه لتخزين كمية صغيرة من البيانات. يمكن تعيين سياسات انتهاء الصلاحية على ملفات تعريف الارتباط لإبطال العناصر بعد فترة زمنية معينة.
ASP.NET ViewState هو مفهوم فقط في WebForms (وليس MVC) حيث يتم تخزين البيانات المتعلقة بالصفحات وعناصر التحكم في الصفحة التي تم إنشاؤها (جانب العميل). الذي يحتفظ بالقيم عبر طلبات متعددة للخادم. يتم تنفيذ ViewState داخليًا كحقول مخفية مشفرة في ASP.NET. لا ينبغي استخدام ViewState لتخزين كميات كبيرة من البيانات حيث يتم تمريرها إلى الخادم لكل طلب.
يشبه الحقل المخفي أي عنصر تحكم آخر في صفحة ما ، لكن الحالة المرئية لهذا التحكم هذه خاطئة دائمًا. مثل ViewState ، يجب ألا نستخدمها لتخزين كميات كبيرة من البيانات. يمكن استخدام الإطارات المخفية لتخزين البيانات في جانب العميل ، ولكن لاحظ أن الإطارات المخفية لا تدعمها جميع متصفحات الإنترنت.
يوفر متصفحات الإنترنت آلية التخزين المؤقت لتخزين صفحات Cache في جانب العميل. يمكن تعيين ذلك باستخدام توجيه انتهاء الصلاحية إلى رأس الصفحات أو عن طريق تعيينه يدويًا في خادم الويب. يجب أن نستخدم هذا الخيار لتخزين المواد الثابتة والبرامج النصية و CSS والصور في جانب العميل.
صنعت مع ❤ بواسطة خافيير كانون.