Система.Во время выполнения.Кэширование.Многорычажка против строки httpruntime.Кэш - есть ли какие-либо различия?


мне интересно, есть ли какие-либо различия между MemoryCache и HttpRuntime.Cache, какой из них предпочтительнее ASP.NET проекты MVC?

насколько я понимаю, оба потокобезопасны, API с первого взгляда более или менее одинаковы, так что есть ли разница, когда использовать какой?

3 79

3 ответа:

HttpRuntime.Cache получает Cache для текущего приложения.

The MemoryCache класс похож на ASP.NET Cache класса.

The MemoryCache класс имеет много свойств и методов для доступа к кэшу, которые будут знакомы вам, если вы использовали ASP.NET Cache класса.

основное различие между HttpRuntime.Cache и MemoryCache это то, что последний был изменен, чтобы сделать его пригодным для использования .NET Рамочные приложения, которые не являются ASP.NET приложения.

для дополнительного чтения:

обновление :

согласно отзывам пользователей, иногда блог Джона Дэвиса не работает.Поэтому я поместил всю статью как изображение.Пожалуйста, взгляните на это.

Примечание : если это не ясно, то просто нажмите на изображение.После этого он откроется в браузере.Затем снова нажмите на него, чтобы увеличить:)

enter image description here

вот статья Джона Дэвиса. Чтобы сохранить читаемость, я вырезаю теперь устаревший раздел EntLib, вступление, а также заключение.


ASP.NET кэш

ASP.NET или система.Сеть.сборка dll, имеет механизм кэширования. Он никогда не предназначался для использования вне веб-контекста, но его можно использовать вне интернета, и он выполняет все вышеперечисленные действия истечения срока действия в хэш-таблице.

после очистки Google, похоже, что довольно много людей, которые обсуждали встроенные функции кэширования в .NET, прибегли к использованию ASP.NET кэш в своих не-веб-проектах. Это уже не самая доступная, наиболее поддерживаемая встроенная система кэширования в .NET; .NET 4 имеет ObjectCache, в который я войду позже. Microsoft всегда была непреклонна в том, что ASP.NET кэш не предназначен для использования вне сети. Но многие люди все еще застряли в .NET 2.0 и .NET 3.5, и им нужно что-то для работы, и это случается работать для многих людей, хотя MSDN ясно говорит:

Примечание: класс кэша не предназначен для использования за пределами ASP.NET приложения. Он был конструирован и был испытан для пользы внутри ASP.NET чтобы обеспечить кэширование для веб-приложений. В других типах приложений, таких как консольные приложения или приложения Windows Forms, ASP.NET кэширование может работать неправильно.

класс для ASP.NET кэш-это система.Сеть.Кэширование.Кэш внутри Система.Сеть.файл DLL. Однако, вы не можете просто создать новый объект кэша. Вы должны приобрести его от системы.Сеть.Строки httpruntime.Кэш.

Cache cache = System.Web.HttpRuntime.Cache;

работа с ASP.NET кэш задокументирован на MSDN здесь.

плюсы:

  1. это встроенный.
  2. несмотря на .Синтаксис net 1.0, это довольно простой использовать.
  3. при использовании в веб-контексте, это хорошо проверенный. Снаружи веб-контексты, согласно поискам Google, обычно не вызывают проблем, несмотря на рекомендации Microsoft против этого, если вы используете .NET 2.0 или более позднюю версию.
  4. вы можете уведомления через делегат, когда элемент удаляется, что необходимо, если вам нужно сохранить его в живых, и вы не можете установить приоритет элемента заранее.
  5. отдельные элементы имеют гибкость любого из (a), (b) или (c) методов истечения срока действия и удаления в списке методов удаления в верхней части этой статьи. Можно также связать поведение истечения срока действия с наличием физического файла.

плюсы:

  1. он не только статичен, есть только один. Вы не можете создать свой собственный тип с собственным статическим экземпляром кэша. Вы можете иметь только одно ведро для всего вашего приложения, период. Вы можете обернуть ведро своими фантиками, что делать вещи, как предварительно вводить префиксы в ключи и удалите эти префиксы, когда вы вытащите пары ключ / значение обратно. Но есть еще только одно ведро. Все свалено в кучу. Это может быть настоящей неприятностью, если, например, у вас есть служба, которая должна кэшировать три или четыре различных типа данных отдельно. Это не должно быть большой проблемой для патетически простых проектов. Но если проект имеет какую-либо значительную степень сложности из-за своих требований, то ASP.NET кэш обычно не будет достаточно.
  2. предметы могут исчезнуть, волей-неволей. Многие люди не знают об этом-я не был, пока не обновил свои знания об этой реализации кэша. По умолчанию, ASP.NET кэш предназначен для уничтожения элементов, когда он "чувствует", как это. Более конкретно, см. (c) в моем определении таблицы кэша в верхней части этой статьи. Если другой поток в том же процессе работает над чем-то совершенно другим, и он сбрасывает высокоприоритетные элементы в кэш, то как только .NET решит, что ему требуется некоторая память, он начнет уничтожать некоторые элементы в кэше в соответствии с их приоритетами, сначала более низкими приоритетами. Все примеры, описанные здесь для добавления элементов кэша, используют приоритет по умолчанию, а не значение notremovable priority, которое не позволяет удалить его для целей очистки памяти, но все равно удалит его в соответствии с политикой истечения срока действия. Peppering CacheItemPriority.NotRemovable в вызовах кэша может быть громоздким, в противном случае необходима обертка.
  3. ключ должен быть строкой. если, например, вы кэшируете записи данных, где записи имеют ключ на длинное или целое число, вы должны сначала преобразовать ключ в строку.
  4. синтаксис устарел. Это синтаксис .NET 1.0, даже уродливее, чем ArrayList или Hashtable. Здесь нет дженериков, нет интерфейса IDictionary. У него нет метода Contains (), нет коллекции ключей, нет стандартных событий; он только имеет метод Get () плюс индексатор, который делает то же самое, что и Get (), возвращая null, если нет совпадения, плюс Add (), Insert() (избыточный?), Удалить () и GetEnumerator ().
  5. игнорирует сухой принцип настройки поведения истечения срока действия/удаления по умолчанию, чтобы вы могли забыть о них. Вы должны явно указать кэшу, как вы хотите, чтобы добавляемый элемент истекал или удалялся каждый раз, когда вы добавляете добавить элемент.
  6. нет способа получить доступ к кэширование деталей кэшированного элемента, таких как метка времени, когда он был добавлен. Инкапсуляция здесь немного переборщила, что затрудняет использование кэша, когда в коде вы пытаетесь определить, должен ли кэшированный элемент быть недействительным против другого механизма кэширования (т. е. коллекции сеансов) или нет.
  7. событий удаления не отображаются как события и должны быть отслежены во время добавить.
  8. и если я не сказал достаточно, Microsoft явно рекомендует против него за пределами интернета. И если вы прокляты.NET 1.1, вы не должны использовать его с какой-либо уверенностью в стабильности вообще вне сети, так что не беспокойтесь.

.NET 4.0 ObjectCache / MemoryCache

Microsoft наконец реализовала абстрактный класс ObjectCache в последней версии .NET Framework и реализацию MemoryCache, которая наследует и реализует ObjectCache для целей в памяти в не-веб-настройки.

MemoryCache - это то, что он говорит, это кэш, хранящийся в

HttpRuntime.Кэш (см. http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache (v=vs.100). aspx и http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx) сохраняется для того, что вы настраиваете его в своем приложении.

см., например, "ASP.NET 4.0: написание пользовательского кэша вывода услуги поставщиков" http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx