Преимущества Cache vs Session

В чем разница между хранением данных в Session vs Cache? Какие преимущества и недостатки?

Таким образом, если это простая страница поиска, которая возвращает результат в виде данных и связывает его с сеткой. Если пользователь "a" выполняет поиск и пользователь "b" выполняет поиск, лучше сохранить его в сеансе, так как каждый пользователь, скорее всего, будет иметь разные результаты, или я все еще могу сохранять каждый из своих поисков в Cache, или это не имеет смысла, поскольку существует только один кеш. Я предполагаю, что в основном я пытаюсь сказать, что кэш будет перезаписан.

10 ответов

Решение

Одним из важных отличий является то, что элементы в кеше могут истечь (будут удалены из кеша) через определенный промежуток времени. Элементы, помещенные в сеанс, будут оставаться там до тех пор, пока сеанс не закончится.

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

Еще одно отличие: состояние сеанса можно сохранять внешним (сервер состояний, сервер SQL) и совместно использовать его между несколькими экземплярами веб-приложения (для балансировки нагрузки). Это не относится к кешу.

Помимо этих различий (как уже отмечали другие): сессия на пользователя / сессия, а кэш на приложение.

AFAIK, ключевое отличие в том, что сессия для каждого пользователя, в то время как кэш будет для элементов области приложения.

Как отмечено в других ответах, вы можете хранить информацию о пользователях в кеше, предоставляя ключ (по сеансу или по cookie). Тогда у вас будет больше возможностей контролировать элементы в кэше, а также устанавливать зависимости от них. Таким образом, если рассматриваемый DataTable будет меняться на регулярной основе, то, возможно, кеширование является подходящим вариантом. В противном случае, если это статический сеанс, может быть более подходящим. У Стивена Смита есть отличное видео о кешировании на dnrtv, которое стоит посмотреть.

Это действительно зависит от того, чего вы пытаетесь достичь, сколько у вас есть времени. Существуют и другие альтернативы, которые следует учитывать при хранении состояния в приложении. В зависимости от размера таблицы вы можете сохранить ее в куки (зашифрованном, если это конфиденциальная информация). В качестве альтернативы, если это данные области приложения, вы можете использовать статическое поле на странице или в классе. Также есть объект Application.

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

Are they going to access the data frequently?  

(Нет, не беспокойтесь).

Is it going to change?  

(Нет, используйте статическое поле или приложение).

Is it acceptable for user a and user b to see the same results?  

(Нет, используйте кеш с ключом, состоящим из имени пользователя и условия поиска.).
(Да, используйте кеш, используя ключ поискового запроса).

Хотя, если честно, если вы не далеко продвинулись в своем развитии, я бы подумал перенести проблему кэширования / состояния на более позднюю дату - она ​​может вам даже не понадобиться.

Первые три правила настройки производительности: 1. Мера, 2. Мера еще немного. 3. Мера снова...

Еще одно важное отличие: состояние сеанса будет заблокировано, если будут выполняться параллельные асинхронные запросы Ajax, это повлияет на производительность.

Кэш находится в области применения с целью уменьшения количества получаемых фрагментов данных. Сессия находится в области действия пользователя с целью определения определенного пользовательского состояния.

Ну, это зависит от того, как у вас настроен сеанс для ASP.NET. Вы храните сеанс в базе данных или в памяти? Если в памяти вы используете отдельный сервер или вы используете текущий веб-сервер для сеанса?

В зависимости от того, как все настроено для вас, могут возникнуть проблемы с производительностью, когда вы используете что-то вроде таблицы данных, которая говорит мне, что вы, возможно, храните большие объемы данных.

Кроме того, сеанс сохраняется для каждого пользователя и извлекается для каждого пользователя посредством его билета сеанса, который хранится либо в файле cookie сеанса, либо в URL-адресе, если они не принимают файлы cookie и вы настроили ASP.NET в режим без файлов cookie. Все, что вы кэшируете, будет кэшироваться на уровне приложения и будет доступно для всех пользовательских сессий, которые могут быть или не быть тем, что вы хотите.

Сессия для пользователя, кэш для приложения.

Элементы в кэше могут и будут удаляться автоматически в зависимости от времени истечения (скользящего или фиксированного) и ограничений памяти рабочего процесса IIS.

Таким образом, в принципе, элементы в Cache никогда не гарантируются, но Session останется там до конца сессии.

Хранение элементов для каждого пользователя (через сеанс или творческое использование кэша) может привести к значительному использованию памяти и должно быть тщательно продумано.

Помимо всего этого, если IIS сбрасывает рабочий процесс, вы можете потерять кэш и сеанс.

Смотрите этот ответ.

Сеанс может снизить производительность вашего приложения, если вы не используете какой-либо бэкэнд-провайдер, такой как memcached или speed. Как правило, вы должны избегать этого.

Насколько я знаю, все зависит от ваших потребностей.

Каждый раз, когда вам нужно поддерживать состояние для пользователей, вы должны быть очень осторожны при использовании сеансов. Значение по умолчанию - "InProc", которое использует память отдельного сервера, плохо работает в облачных приложениях. Это может быть применимо для тех из вас, кто размещает свое приложение в среде веб-фермы с несколькими экземплярами. Балансировщик нагрузки Windows Azure использует циклическое распределение внутри подключенных узлов.

У вас есть несколько вариантов в хранилище сеансов. SQL Server также можно использовать в качестве хранилища состояния сеанса. Пользовательские методы сеанса доступны в Azure, например поставщик хранилища таблиц и т. Д.

Кэш также хранится в памяти сервера, но это не имеет отношения к пользователям. Любой пользователь в том же пуле может получить доступ к данным кеша приложения. Короче говоря, в облаке нам нужно использовать службу кэширования, предоставляемую поставщиками облачных услуг. Azure предоставляет службу распределенного кэширования Windows Azure.

На самом деле разработчики не заботятся о влиянии методов управления состоянием при их применении в приложениях. Это

"Если у вашего клиента нет облачной поддержки, то вам не стоит беспокоиться об облачных сценариях"

Я только что столкнулся с еще одним ограничением, которое вызвало у меня несколько проблем в последних версиях .NET. То есть с помощью кеша хранить объекты можно очень просто. В сеансах вы можете хранить только строки.

Теперь, очевидно, вы можете сериализовать свои объекты и хранить их в виде строк, но это дополнительный шаг, и я не настолько уверен, что сериализация всегда работает так, как вы этого хотите. Вы должны убедиться, что ваш объект сериализуем. Существует множество примеров методов расширения, которые можно использовать, чтобы значительно упростить задачу.

Но с кешем, похоже, просто работает . И, будучи ленивым разработчиком, я действительно не хочу лишних хлопот с сериализацией. Существуют также некоторые существенные различия между различными сериализаторами, такими как Newtonsoft.Json и новым System.Text.Json. Хотя, возможно, это не имеет значения, поскольку вы будете использовать один и тот же сериализатор Json как для входа, так и для выхода.

Учитывая все приведенные выше ответы, Cache кажется беспроигрышным вариантом, и если ваше приложение когда-нибудь выйдет из строя и память вашего сервера выйдет из строя, вы всегда можете использовать что-то вроде Redis, чтобы начать обрабатывать этот кеш за вас с минимальными усилиями.

Сеанс зависит от пользователя, а Cache - нет. Эта статья полезна.

Другие вопросы по тегам