Постоянный дисковый кэш для файловой системы для ASP.NET

Резюме: https://www.codeproject.com/articles/12097/cache-management-in-asp-net
Используйте разные термины для объяснения одной и той же концепции, то есть управления данными. Некоторые люди называют это руководством штата, а некоторые другие называют его управлением кэшем. Мне нравится слово «кеш». Но концептуально нет никакой разницы между этими двумя.
Теперь давайте обсудим различные аспекты управления кэшем (или управления состоянием) в ASP.NET.
Хотя управление кэшем не является проблемой в приложениях Windows, это всегда было проблемой в веб -среде. Поскольку HTTP является протоколом без сохранения, и веб-сервер не распознает пользователей между различными запросами, для нас становится очень важным распознавать конкретного пользователя между различными запросами, а также хранить данные, чтобы его можно было повторно использовать между различными запросами. ASP.NET предоставляет много функций для хранения данных как в сторонах клиента (браузер), так и на сервере (веб -сервер), но иногда мы путаем, когда использовать что. В ASP.NET мы сталкиваемся с такими функциями, как сеанс, приложение и объекты кэша, но для нас важно понять разницу между ними, чтобы эффективно использовать их в веб -приложениях.
В этой статье я коснусь различных параметров управления кэшем, доступными в ASP.NET. В веб-приложении иногда нам требуется хранить данные на стороне сервера, чтобы избежать дорогостоящей операции поиска данных из хранилищ данных и логики форматирования данных, потребляющих много времени для повышения производительности приложения, а также для повторного использования тех же данных в последующих запросах по пользователям, приложениям и машинах. Таким образом, чтобы достичь этого, нам нужно сохранить (кэш) данные на стороне сервера.
Кэширование помогает нам достичь трех важных аспектов QoS (качество обслуживания):
ASP.NET предоставляет объект, который называется Application Object для хранения данных, доступных для всех запросов пользователей. Срок службы этого объекта связан с приложением, и он воссоздается каждый раз, когда начинается приложение. В отличие от объекта сеанса ASP.NET, этот объект доступен для всех запросов пользователей. Поскольку это хранилище создается и поддерживается в пространстве домена приложений, это не следует использовать для хранения данных в сценарии веб -фермы. Эта опция очень полезна для хранения данных, таких как метаданные приложения (данные файлов конфигурации), которые могут быть загружены в объект приложения во время запуска приложения и могут использоваться в течение срока службы приложения без перезарядки его каждый раз для каждого запроса пользователя. Но если существует требование о признании недействительной кэшированные данные всякий раз, когда существует какое -либо изменение в файлах конфигурации во время запуска приложения, этот параметр не следует использовать, поскольку он не предоставляет никакой функции для истечения срока действия кэшированных данных. Таким образом, в этом случае следует использовать другие параметры, такие как объект кэша ASP.NET, что объясняется ниже.
ASP.NET предоставляет объект пары ключей - объект кэша, который доступен в System.Web.Cheing Пространство имен. Объем его - это область приложения, а продолжительность жизни связана с приложением. В отличие от объекта сеанса ASP.NET, этот объект доступен для всех запросов пользователей.
Хотя как приложения, так и кэш -объекты выглядят одинаково, ключевым различием между ними являются дополнительные функции, предоставляемые объектом кэша, такими как политики и зависимости истечения срока действия. Это означает, что данные, хранящиеся в объекте кэша, могут быть истекли/удалены на основе некоторого предопределенного ограничения по времени, установленного кодом приложения или когда зависимая объект изменяется, тогда как эта функция недоступна в объекте приложения.
Давайте обсудим различные политики истечения и зависимости, которые поддерживаются.
Зависимость означает, что элемент может быть удален из кэша, когда изменяется зависимая сущность. Таким образом, зависимые отношения могут быть определены на элементе, удаление которого из кэша будет зависеть от зависимости. Есть два типа зависимостей, поддерживаемых в ASP.NET.
Пример: допустим, в моем приложении я использую файл XML для хранения данных ошибок (номер ошибки и сопоставление сообщений об ошибке), который используется для извлечения сообщения об ошибке для заданного номера ошибки во время выполнения. Поэтому вместо того, чтобы читать файл с диска каждый раз, когда мне нужно сообщение об ошибке, допустим, я решил загрузить его один раз при запуске приложения и сохранить его в кэше ASP.NET для дальнейшего использования. Итак, если мне нужно изменить файл конфигурации, чтобы добавить новые сообщения об ошибках или изменить некоторые из существующих сообщений об ошибках во время запуска приложения, то что будет с моими кэшированными данными? Нужно ли мне остановить приложение и запустить его снова, чтобы отразить изменения файла в приложении? Ответ нет. Данные кэша могут быть недействительными при изменении файла с помощью параметра зависимости файлов.
Политика истечения срока действия устанавливает политику для того, как и когда срок действия элемента в кеше истекает.
Удаленный объект Singleton .NET совместно использует один и тот же экземпляр с несколькими клиентами, поэтому объекты Singleton могут использоваться для хранения и обмена данными между различными призывными к клиентам. Поскольку удаленный .NET может использоваться за пределами процесса и машины, эта опция очень полезна, когда мы хотим кэшировать данные и делиться ими на серверах и пользователях, особенно в сценарии веб -фермы. При таком подходе мы можем сохранить данные в качестве переменных членов Singleton удаленного объекта и предоставить методы для чтения и сохранения данных. Но при реализации этого мы должны убедиться, что удаленный объект, используемый в качестве кэша, не разрушается коллекционером мусора. Для этого нам придется установить срок аренды объекта удаленного кэша в бесконечный, чтобы период аренды никогда не был равен. Мы можем сделать это, переопределив метод инициализалифтизмурации Marshalbyrefobobject и вернуть NULL из этого метода. Но единственная проблема с этим подходом - это производительность. Как говорится в анализе, производительность очень плохая в этом подходе по сравнению с другими подходами. В любом случае, дизайнеры/разработчики приложений должны анализировать различные варианты и использовать лучший, который соответствует требованиям.
Вы все знаете, что такое файл с памятью. В основном речь идет о картировании файла на диске с определенным диапазоном адресов в адресном пространстве процесса приложения. Эта опция позволяет различным процессам использовать одни и те же данные, повышая производительность приложения. Поскольку использование отображаемого памятью файла не очень популярно среди разработчиков .NET, я лично не предполагаю, что этот подход внедряет это, включает в себя множество сложностей, а также .NET Framework не поддерживает это. Но если кто -то очень заинтересован в использовании этого подхода, им придется разработать свое собственное решение в соответствии с их собственным требованием.
Мы используем статические переменные для хранения данных или объектов во всем мире, чтобы получить доступ к ним в течение срока службы приложения. Точно так же в ASP.NET мы можем использовать статические объекты для кэширования данных, а также мы можем также предоставить методы для извлечения и сохранения данных в кэш. Поскольку статические переменные хранятся в области процесса, производительность, это быстрее. Но поскольку в случае статических переменных очень трудно реализовать политики и зависимости истечения срока действия, я обычно предпочитаю объект кэша ASP.NET над этой опцией. Другая проблема заключается в том, что пользовательский объект статического кэша должен быть защищен потоком, который должен быть реализован тщательно.
Мы также можем использовать базу данных для хранения данных и обмена данными между пользователями и машинами. Этот подход очень полезен, когда мы хотим кэшировать большие объемы данных. Использование этого подхода для хранения небольшого количества данных не является хорошей идеей из -за производительности. Для хранения небольшого количества данных мы должны пойти на другие механизмы кэширования ASP.NET. Поскольку данные должны храниться в базе данных, все объекты должны быть сериализованы XML, чтобы их было легче хранить и извлечь. Мы также можем использовать другие типы форматов сериализации, доступных в .NET Framework.
Иногда в нашем приложении, на некоторых страницах выход, как правило, не меняется в течение определенного периода времени. Например, на веб -сайте HR детали зарплаты сотрудника не меняются очень часто и меняются только один раз в месяц. Как правило, он меняется только в 1 -й день каждого месяца. Таким образом, в течение месяца на странице сведений о зарплате будет показана те же данные для конкретного сотрудника. Таким образом, в этом случае разве не рекомендуется кэшировать страницу где -то на сервере, чтобы избежать обработки бизнес -вычислений, вызовов в базу данных и логику рендеринга страниц каждый раз, когда сотрудник хочет видеть данные его зарплаты. На мой взгляд, да! Это очень хорошая идея. Для достижения этого ASP.NET предоставляет функцию для хранения вывода страницы на сервере в течение определенного периода времени. Он также предоставляет функции для хранения фрагмента страницы, которая известна как кэширование фрагмента страницы.
Иногда нам может потребоваться кэшировать данные или страницы на стороне клиента, чтобы повысить производительность приложения. Использование этого механизма уменьшает нагрузку на сервер, но этот механизм имеет некоторые проблемы безопасности, поскольку мы кэшируем данные на стороне клиента.
Cookie-это хранилище на стороне клиента, которое отправляется на сервер для каждого запроса, а также получает в качестве ответа обратно с сервера. Из -за ограничения его размера его следует использовать для хранения небольшого количества данных. Политики истечения срока действия могут быть установлены для файлов cookie для аннулирования элементов через определенный период времени.
ASP.NET ViewState - это концепция только в веб -формах (не MVC), где данные, связанные со страницами и элементами управления, хранятся на сгенерированной странице (стороне клиента). который сохраняет значения по нескольким запросам на сервер. ViewState реализуется внутри, как зашифрованные скрытые поля в ASP.NET. ViewState не следует использовать для хранения больших объемов данных при передаче на сервер для каждого запроса.
Скрытое поле похоже на любое другое управление на странице, но видимое состояние этого управления всегда ложное. Как и ViewState, мы не должны использовать его для хранения больших объемов данных. Скрытые рамки могут использоваться для кэширования данных на стороне клиента, но обратите внимание, что скрытые кадры не поддерживаются всеми интернет -браузерами.
Интернет -браузеры обеспечивают механизм кэширования для кэша страниц на стороне клиента. Это может быть установлено с использованием директивы «Срок действия», добавленной в заголовок страниц, или установив ее вручную на веб -сервере. Мы должны использовать эту опцию для кэширования статических страниц, сценариев, CSS и изображений на стороне клиента.
Сделано с ❤ Хавьер Каньон.