Кэш данных против объекта сеанса в ASP.Net - PullRequest
11 голосов
/ 29 января 2009

Должны ли динамические бизнес-объекты для сайта храниться в сеансе пользователя или использовать кэширование ASP.Net (такие объекты, как заказы, информация профиля и т. Д.)?

Я работал с сайтами, которые использовали сеансы для хранения бизнес-объектов, но мне было интересно ... Каковы преимущества или недостатки кэширования?

Ответы [ 5 ]

24 голосов
/ 29 января 2009

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

7 голосов
/ 29 января 2009

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

Сеанс, с другой стороны, больше подходит для хранения объектов, хотя лично я стараюсь избегать хранения сессий в пользу БД. Я обычно делаю это, абстрагируя хранилище за непрозрачным ISessionStoreService интерфейсом:

interface ISessionStore
{
    T GetEntry<T>(string key);
    void SaveEntry<T>(string key, T entry);
}

и затем "внедрение с зависимостями" соответствующей реализации, будь то InmemorySessionStore , DbSessionStore или что-то еще.

2 голосов
/ 29 января 2009

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

Session => Веб-страница с пошаговым интерфейсом (например, онлайн-тест).
Cache => Информация, отображаемая в каком-то виджете погоды (например, в Google на странице igoogle.com).
Надеюсь, это поможет.

2 голосов
/ 29 января 2009

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

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

1 голос
/ 22 августа 2013

Хотя вы можете хранить свой бизнес-объект в Cache, но Cache предназначен для повышения производительности, а не управления состоянием. Представьте, что у вас есть процесс получения 1000 записей из базы данных (и это займет около 3 секунд), и вам понадобится несколько минут. Вы можете хранить ваши объекты в Cache и устанавливать дату истечения срока действия, приоритет и зависимость от него (например, SqlDependency или FileDependency), поэтому для следующих запросов вы можете использовать кэшированные данные вместо извлечения их из базы данных. Вы можете сохранить свой объект в сеансе, но вы не можете установить зависимость для сеанса по умолчанию. Кэш также обладает уникальным поведением: когда системе требуется память, она освобождает объекты из кэша в зависимости от своего приоритета. Объекты кэша являются глобальными для приложения и совместно используются всеми пользователями, но сеанс не является общим, и его можно использовать для каждого пользователя (сеанс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...