DAL, сессия, архитектура кэша
Я пытаюсь создать уровень доступа к данным для моего веб-приложения. В настоящее время все таблицы данных хранятся в сеансе. Когда я закончу, DAL заполнит и вернет таблицы данных. Хорошо ли хранить возвращенные таблицы данных в сеансе? Распределенный / общий кэш? Или просто пинговать базу данных каждый раз? Примечание: обычно число строк в datatable будет небольшим
Дополнительная информация:
Почти ни одна из этих данных не является общей. Параметры, которые отправляются SQL запросы, которые выбирает пользователь. Значения параметров, доступные пользователю, зависят от его личности. В большинстве случаев два пользователя не могут выполнять одни и те же sql-запросы. Однако один и тот же пользователь может выполнить один и тот же запрос несколько раз.
Подробнее: Количество одновременно работающих пользователей ~50,000
Важная информация: В 99% случаев у двух пользователей не будет одинаковых данных / запросов, однако один и тот же пользователь может выполнить один и тот же запрос/получить одни и те же данные несколько раз. раз.
Спасибо
4 ответа:
Хранение данных в сеансе не является хорошей идеей, потому что:
Каждый пользователь получает отдельную копию одних и тех же данных - колоссальная трата памяти сервера.
- IIS будет повторно использовать сеанс, если вы заполните его слишком большим количеством данных.
Я рекомендую хранить таблицы данных вкэше , а также заполнять каждую таблицу только при первом запросе, а не все сразу. Таким образом, если IIS начнет освобождать место в кэше, ваш код не будет затронут.
Очень просто пример выборки по требованию:
T GetCached<T>(string cacheKey, Func<T> getDirect) { object value = HttpContext.Current.Cache.Item(cacheKey); if(value == null) { value = getDirect(); HttpContext.Current.Cache.Insert(cacheKey, value); } return (T) value; }
EDIT: - обновление вопроса
Кэш против локального сеанса - локальное состояние сеанса-все или ничего. Если он становится слишком полным, IIS будет перерабатывать все в нем. Напротив, элементы кэша удаляются по отдельности, когда память становится слишком низкой, так что это гораздо меньше проблем.
Cache vs Session state server - у меня нет данных для резервного копирования, поэтому, пожалуйста, скажите так, если я ошибся, но я бы подумал, что кэширование данных независимо друг от друга в памяти каждого физического сервера домен приложений будет масштабироваться лучше, чем хранить его в общей службе состояния сеанса.
Первое, что я бы сказал: кэш не является обязательным везде. Вы должны использовать его с умом и особенно на узких местах, связанных с доступом к данным.
Я не думаю, что это хорошая идея, чтобы хранить 1000 различных таблиц данных с 2000 записей в любом месте. Если запросы настолько динамичны, что наличие одного и того же запроса за короткий промежуток времени является исключением, то кэш не кажется хорошим вариантом.
И в отношении опции распределенного кэша я предлагаю вам проверить http://memcached.org . Распределенный кэш, используемый многими крупными проектами по всему миру.
Я знаю, что скорость близка, но пока я знаю, что ей нужна Windows Server 2008, и это что-то очень новое. Обычно продукты Microsoft хороши с версии 2.0: -)
Хранитепоисковые запросы/словари - и элементы, которые ваше приложение будет требовать очень часто в
Application
илиCache
объекте; запрашивайте базу данных для данных, которые зависят от роли пользователя.--EDIT--
Это ответ на ваш комментарий.
Обычно в любой системе, ориентированной на данные, запросы выполняются вокруг таблицы фактов(или таблиц, которые неизбежно запрашиваются); предполагая, что у вас есть Набор неизбежных таблиц, поэтому вы можете использовать
Cache.Insert()
:
- загрузить неизбежные таблицы при запуске приложения;
- загрузка большинства запрашиваемых таблиц в кэш на основе запросов таблиц;
- запрос базы данных для наименее запрашиваемых таблиц.
Если у вас нет проблем с производительностью, то пусть SQL обрабатывает все.