[C#] System.Runtime.Caching.MemoryCache مقابل HttpRuntime.Cache - هل هناك أي اختلافات؟


Answers

هنا مقال جون ديفيس. للحفاظ على سهولة القراءة، أقوم بتقليص قسم إنليب القديم، والمقدمة وكذلك الاستنتاج.

ذاكرة التخزين المؤقت ASP.NET

ASP.NET، أو التجمع System.Web.dll، لديه آلية التخزين المؤقت. لم يكن المقصود أبدا أن يتم استخدامها خارج سياق الويب، ولكن يمكن استخدامه خارج شبكة الإنترنت، وأنها تؤدي جميع السلوكيات انتهاء الصلاحية أعلاه في هشتابل من أنواع.

بعد تجوب غوغل، يبدو أن عددا قليلا جدا من الأشخاص الذين ناقشوا وظيفة التخزين المؤقت المضمنة في .NET لجأوا إلى استخدام ذاكرة التخزين المؤقت ASP.NET في مشاريعهم غير ويب. هذا لم يعد الأكثر المتاحة، الأكثر دعما المدمج في نظام التخزين المؤقت في .NET. .NET 4 يحتوي على أوبجكتكاش التي سوف تحصل في وقت لاحق. كانت مايكروسوفت دائما مصرة على أن ذاكرة التخزين المؤقت ASP.NET غير مخصص للاستخدام خارج شبكة الإنترنت. ولكن العديد من الناس لا تزال عالقة في .NET 2.0 و. نيت 3.5، وتحتاج إلى شيء للعمل مع، وهذا يحدث للعمل لكثير من الناس، على الرغم من مسن يقول بوضوح:

ملاحظة: فئة الذاكرة المؤقتة غير مخصصة للاستخدام خارج تطبيقات ASP.NET. تم تصميمه واختباره للاستخدام في ASP.NET لتوفير التخزين المؤقت لتطبيقات الويب. في أنواع أخرى من التطبيقات، مثل تطبيقات وحدة التحكم أو تطبيقات نماذج ويندوز، قد لا يعمل التخزين المؤقت ASP.NET بشكل صحيح.

الفئة لذاكرة التخزين المؤقت ASP.NET هو System.Web.Caching.Cache في System.Web.dll. ومع ذلك، لا يمكنك ببساطة جديد كائن ذاكرة التخزين المؤقت. يجب الحصول عليه من System.Web.HttpRuntime.Cache.

Cache cache = System.Web.HttpRuntime.Cache;

يتم توثيق العمل مع ذاكرة التخزين المؤقت ASP.NET على مسن هنا .

الايجابيات:

  1. انها مدمجة .
  2. على الرغم من بناء الجملة .NET 1.0، انها بسيطة إلى حد ما للاستخدام.
  3. عند استخدامها في سياق الويب، يتم اختبارها بشكل جيد . خارج سياقات الويب، وفقا لعمليات بحث غوغل فإنه ليس من المعروف أن يسبب مشاكل، على الرغم من ميكروسوفت توصي ضد ذلك، طالما كنت تستخدم .NET 2.0 أو في وقت لاحق.
  4. يمكنك أن يتم إعلامك عن طريق مندوب عندما تتم إزالة عنصر، وهو أمر ضروري إذا كنت في حاجة للحفاظ عليه على قيد الحياة، وكنت لا يمكن تعيين أولوية البند مقدما.
  5. البنود الفردية لديها مرونة أي من (أ) أو (ب) أو (ج) أساليب انتهاء الصلاحية وإزالة في قائمة طرق الإزالة في أعلى هذه المقالة. يمكنك أيضا ربط سلوك انتهاء الصلاحية بوجود ملف فعلي.

سلبيات:

  1. ليس فقط هو ثابت، هناك واحد فقط . لا يمكنك إنشاء النوع الخاص بك مع مثيل ثابت من ذاكرة التخزين المؤقت. يمكن أن يكون لديك دلو واحد فقط للتطبيق بأكمله، الفترة. يمكنك التفاف الدلو مع مغلفات الخاصة بك التي تفعل أشياء مثل البادئات قبل حقن في المفاتيح وإزالة هذه البادئات عند سحب مفتاح / قيمة أزواج العودة. ولكن لا يزال هناك دلو واحد فقط. كل شيء معقد معا. قد يكون هذا مصدر إزعاج حقيقي إذا كان لديك على سبيل المثال خدمة تحتاج إلى تخزين ثلاثة أو أربعة أنواع مختلفة من البيانات بشكل منفصل. هذا لا ينبغي أن يكون مشكلة كبيرة للمشاريع بسيطة باثيتيكالي. ولكن إذا كان لدى المشروع أي درجة كبيرة من التعقيد بسبب متطلباته، فإن ذاكرة التخزين المؤقت ASP.NET عادة لا تكفي.
  2. يمكن أن تختفي العناصر، ويليلي . وهناك الكثير من الناس ليسوا على بينة من هذا لم أكن، حتى أنا تحديث معرفتي حول هذا التطبيق ذاكرة التخزين المؤقت. افتراضيا، تم تصميم ذاكرة التخزين المؤقت ASP.NET لتدمير العناصر عندما "يشعر" مثل ذلك. وبشكل أكثر تحديدا، راجع (ج) في تعريفي لجدول ذاكرة التخزين المؤقت في أعلى هذه المقالة. إذا كان مؤشر ترابط آخر في نفس العملية يعمل على شيء مختلف تماما، وأنه يقذف العناصر ذات الأولوية العالية في ذاكرة التخزين المؤقت، ثم في أقرب وقت .NET يقرر أنه يحتاج إلى بعض الذاكرة سوف تبدأ في تدمير بعض العناصر في ذاكرة التخزين المؤقت وفقا ل وأولوياتها، وانخفاض الأولويات أولا. تستخدم كل الأمثلة الموثقة هنا لإضافة عناصر ذاكرة التخزين المؤقت الأولوية الافتراضية بدلا من قيمة الأولوية غير القابلة للإزالة التي تحافظ على إزالتها لأغراض مسح الذاكرة ولكن ستظل تزيلها وفقا لسياسة انتهاء الصلاحية. بيبرينغ CacheItemPriority.NotRemovable في الاستدعاءات ذاكرة التخزين المؤقت يمكن أن تكون مرهقة، وإلا المجمع ضروري.
  3. يجب أن يكون المفتاح سلسلة. إذا، على سبيل المثال، يتم التخزين المؤقت سجلات البيانات حيث يتم تسجيل السجلات على عدد طويل أو عدد صحيح، يجب تحويل المفتاح إلى سلسلة أولا.
  4. بناء الجملة هي قديمة . انها بناء الجملة .NET 1.0، حتى أبطأ من أريليست أو هاشتابل. لا توجد الأدوية هنا، لا إديكتيوناري <> واجهة. أنه لا يحتوي على () طريقة، لا جمع مفاتيح، لا الأحداث القياسية. فإنه لا يحتوي إلا على طريقة جيت () بالإضافة إلى فهرس يقوم بنفس الشيء مثل جيت ()، ويعود نول إذا لم يكن هناك تطابق، بالإضافة إلى إضافة () و إنزيرت () (ريدوندانت؟) و ريموف () و جيتنوميراتور .
  5. يتجاهل مبدأ الجفاف من إنشاء الافتراضي الخاص بك انتهاء الصلاحية / إزالة السلوكيات حتى تتمكن من نسيان لهم. يجب أن تخبر ذاكرة التخزين المؤقت بشكل صريح كيف تريد انتهاء صلاحية العنصر الذي تضيفه أو إزالته في كل مرة تضيف فيها عنصرا.
  6. لا توجد طريقة للوصول إلى تفاصيل التخزين المؤقت لعنصر مخزنة مؤقتا مثل الطابع الزمني عند إضافته. تم تغليف العبوة قليلا هنا، مما يجعل من الصعب استخدام ذاكرة التخزين المؤقت عندما تكون في التعليمات البرمجية التي تحاول تحديد ما إذا كان يجب أن يتم إبطال عنصر مخبأ ضد آلية التخزين المؤقت آخر (أي جمع الدورة) أم لا.
  7. لا تتعرض الأحداث إزالة كأحداث ويجب أن تعقب في وقت إضافة.
  8. وإذا لم أكن قد قلت ذلك، توصي ميكروسوفت صراحة ضد ذلك خارج شبكة الإنترنت. وإذا كنت لعن مع. نيت 1.1، لم يكن من المفترض أن استخدامه مع أي ثقة الاستقرار على الإطلاق خارج شبكة الإنترنت حتى لا تهتم.

. أوبجكتكاش / ميموريكاش .NET 4.0

نفذت ميكروسوفت أخيرا فئة أوبجكتكاش مجردة في أحدث إصدار من .NET فريميورك وتنفيذ ميموريكاش الذي يرث وينفذ أوبجكتيكاش لأغراض في الذاكرة في إعداد غير الويب.

System.Runtime.Caching.ObjectCache في التجميع System.Runtime.Caching.dll. وهي فئة مجردة أن يعلن أساسا نفس واجهات نمط .NET 1.0 التي توجد في ذاكرة التخزين المؤقت ASP.NET. System.Runtime.Caching.MemoryCache هو تنفيذ الذاكرة في أوبجكتكاش وتشبه إلى حد بعيد ذاكرة التخزين المؤقت ASP.NET، مع بعض التغييرات.

لإضافة عنصر بنقطة انزلاق، ستظهر شفرتك بالشكل التالي:

var config = new NameValueCollection();  
var cache = new MemoryCache("myMemCache", config);  
cache.Add(new CacheItem("a", "b"),  
    new CacheItemPolicy  
    {  
        Priority = CacheItemPriority.NotRemovable,  
        SlidingExpiration=TimeSpan.FromMinutes(30)  
    }); 

الايجابيات:

  1. انها مدمجة، والآن معتمدة وأوصى بها مايكروسوفت خارج شبكة الإنترنت.
  2. على عكس ذاكرة التخزين المؤقت ASP.NET، يمكنك إنشاء مثيل كائن ميموريكاش.

    ملاحظة: لا يجب أن تكون ثابتة، ولكن يجب أن يكون - وهذا هو توصية مايكروسوفت (انظر تحذير الأصفر) .

  3. تم إجراء بعض التحسينات الطفيفة مقابل واجهة ذاكرة التخزين المؤقت ASP.NET، مثل القدرة على الاشتراك في أحداث الإزالة دون وجود بالضرورة هناك عندما تمت إضافة العناصر، تمت إزالة إنزيرت () زائدة، ويمكن إضافة عناصر مع كاشيتم كائن مع التهيئة التي تحدد استراتيجية التخزين المؤقت، و يحتوي على () تمت إضافة.

سلبيات:

  1. لا يزال لا يعزز تماما الجافة. من بلدي كمية صغيرة من الخبرة، لا يزال لا يمكن تعيين انزلاق انتهاء تيمسبان مرة واحدة وننسى ذلك. وبصراحة، على الرغم من أن السياسة في البند-إضافة عينة أعلاه هو أكثر قابلية للقراءة، فإنه يتطلب الفظاعة المروعة.
  2. وهي لا تزال غير مدروسة بشكل عام؛ فإنه يتطلب سلسلة كمفتاح. لذلك لا يمكنك تخزينها لفترة طويلة أو إنت إذا كنت تقوم بتخزين سجلات البيانات مؤقتا، إلا إذا قمت بتحويل إلى سلسلة.

دي: بناء واحد نفسك

انها في الواقع بسيطة جدا لإنشاء قاموس التخزين المؤقت الذي يؤدي انتهاء صريح أو انزلاق. (فإنه يحصل على الكثير من الصعب إذا كنت تريد العناصر التي سيتم إزالتها لصناعة السيارات لأغراض إزالة الذاكرة.) وهنا كل ما عليك القيام به:

  1. إنشاء فئة حاوية قيمة تسمى شيء مثل إكسيرينغ أو إكسيرابل التي تحتوي على قيمة من نوع T، خاصية تيمستامب من نوع داتيتيم لتخزين عند إضافة القيمة إلى ذاكرة التخزين المؤقت و تيمسبان التي تشير إلى مدى بعيدا عن الطابع الزمني الذي يجب أن تنتهي صلاحية العنصر. لانتهاء صلاحية صريحة يمكنك فقط تعريض واضعة الخاصية التي تحدد تيمسبان إعطاء تاريخ طرح من الطابع الزمني.
  2. إنشاء فئة، دعونا نسميها إكسيرابليتمزديكتيوناري، الذي ينفذ إديتيوناري. أنا أفضل لجعلها فئة عامة مع تعريف من قبل المستهلك.
  3. في الفئة التي تم إنشاؤها في # 2، إضافة قاموس> كخاصية وندعوها إنرديكتيوناري.
  4. تنفيذ إذا إيديكتيوناري في الفئة التي تم إنشاؤها في # 2 يجب استخدام إنرديكتيوناري لتخزين العناصر المخزنة مؤقتا. سيؤدي التغليف إلى إخفاء تفاصيل طريقة التخزين المؤقت عبر مثيلات النوع الذي تم إنشاؤه في # 1 أعلاه.
  5. تأكد من أن المفهرس (هذا [])، كونتسكي ()، وما إلى ذلك، حريصون على مسح العناصر منتهية الصلاحية وإزالة العناصر منتهية الصلاحية قبل إرجاع قيمة. عودة فارغة في الحاصل إذا تمت إزالة العنصر.
  6. استخدام تأمين الترابط على كافة الحاصلين، واضعين، كونتنتكي ()، وخصوصا عند مسح العناصر منتهية الصلاحية.
  7. رفع حدث كلما تتم إزالة عنصر بسبب انتهاء الصلاحية.
  8. إضافة مثيل System.Threading.Timer وتلاعب عليه أثناء التهيئة لإزالة العناصر المنتهية الصلاحية تلقائيا كل 15 ثانية. هذا هو نفس سلوك ذاكرة التخزين المؤقت ASP.NET.
  9. قد ترغب في إضافة روتين أدوروبديت () الذي يدفع انتهاء صلاحية الانزلاق عن طريق استبدال الطابع الزمني على حاوية العنصر (مثال منتهي الصلاحية) إذا كان موجودا بالفعل.

يجب أن تدعم ميكروسوفت التصاميم الأصلية لأن قاعدة المستخدمين لديها قد تبنى الاعتماد عليها، ولكن هذا لا يعني أنها تصاميم جيدة.

الايجابيات:

  1. لديك سيطرة كاملة على التنفيذ.
  2. يمكن أن تعزز الجافة عن طريق إعداد السلوكيات التخزين المؤقت الافتراضي ومن ثم مجرد إسقاط أزواج مفتاح / قيمة في دون الإعلان عن تفاصيل التخزين المؤقت في كل مرة تقوم بإضافة عنصر.
  3. يمكن تنفيذ واجهات الحديثة ، وهي IDictionary<K,T> . هذا يجعل من الاسهل بكثير للاستهلاك كما واجهة أكثر قابلية للتنبؤ به واجهة القاموس، بالإضافة إلى أنه يجعل من أكثر سهولة للمساعدين وأساليب الإرشاد التي تعمل مع إديكتيوناري <>.
  4. يمكن تخزين أونكينغابسولاتد تفاصيل التخزين المؤقت ، مثل تعريض إنرديكتيوناري الخاص بك عن طريق خاصية للقراءة فقط العامة، مما يسمح لك لكتابة اختبارات وحدة صريحة ضد استراتيجية التخزين المؤقت الخاصة بك وكذلك توسيع تنفيذ التخزين المؤقت الأساسي الخاص بك مع استراتيجيات التخزين المؤقت إضافية التي تقوم على ذلك.
  5. على الرغم من أنها ليست بالضرورة واجهة مألوفة لأولئك الذين جعلوا أنفسهم أنفسهم مريحة مع بناء نمط .NET 1.0 من ذاكرة التخزين المؤقت ASP.NET أو كتلة تطبيق التخزين المؤقت، يمكنك تعريف واجهة لتبدو وكأنها تريد أن تبدو.
  6. يمكن استخدام أي نوع للمفاتيح. هذا هو أحد الأسباب التي تم إنشاء الأدوية. ليس كل شيء يجب أن يكون مرتبطا مع سلسلة.

سلبيات:

  1. لا اخترع من قبل، ولا أقرتها مايكروسوفت ، لذلك لن يكون لها نفس ضمان الجودة.
  2. على افتراض فقط يتم تنفيذ التعليمات التي وصفتها أعلاه، لا "بشكل طفيف" بشكل واضح "البنود واضحة لتطهير الذاكرة على أساس الأولوية (وهو وظيفة زاوية الزاوية وظيفة ذاكرة التخزين المؤقت على أي حال .. شراء ذاكرة الوصول العشوائي حيث كنت تستخدم ذاكرة التخزين المؤقت ، ذاكرة الوصول العشوائي رخيصة).

من بين هذه الخيارات الأربعة، هذا هو تفضيلي. لقد نفذت هذا الحل التخزين المؤقت الأساسي. حتى الآن، يبدو أن تعمل تماما، لا توجد أخطاء معروفة (يرجى الاتصال بي مع التعليقات أدناه أو في جون-أت-جوندافيس إذا كان هناك !!)، وأعتزم استخدامها في كل من المشاريع الجانبية الصغيرة التي تحتاج التخزين المؤقت الأساسي. ها هو:

جيثب الرابط: https://github.com/kroimon/ExpirableItemDictionary

الرابط القديم: ExpirableItemDictionary.zip

جدير بالذكر: أبفابريك، نوسقل، إت آل

لاحظ أن عنوان هذه المقالة بلوق يشير "التخزين المؤقت بسيط"، وليس "التخزين المؤقت الثقيلة". إذا كنت ترغب في الحصول على الاشياء الثقيلة، يجب أن ننظر في مخصصة، والحلول على نطاق واسع.

Question

أنا أتساءل عما إذا كان هناك أي اختلافات بين MemoryCache و HttpRuntime.Cache ، أي واحد هو المفضل في مشاريع ASP.NET مفك؟

بقدر ما أفهم، وكلاهما موضوع آمن، أبي هو من أول وهلة أكثر أو أقل نفس، لذلك هناك أي فرق عند استخدام أي؟