Как кэшировать данные пользователя в частичном в mvc

В заголовке каждой страницы я показываю Username и User points. Это извлекается из частичного (который получает точки из базы данных).

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

Ответ 1

Это конкретный пользователь, поэтому я бы сохранил его в постоянном файле cookie. Поэтому, когда пользователь аутентифицируется, вы можете запросить базу данных для получения требуемой информации и выпустить постоянный файл cookie, срок действия которого истекает через 24 часа. Затем в частичном случае вы должны проверить, существует ли файл cookie и извлекать необходимые данные из этого файла cookie, и если файл cookie не существует, запросите базу данных и переименуйте файл cookie. Когда пользователь выйдет из системы, вы можете удалить файл cookie, хотя это не является абсолютно необходимым, потому что, когда он снова войдет в систему (с тем же или другим именем пользователя), вы снова запросите базу данных и переигнете файл cookie.

И поскольку мы живем в 2011 году, а HTML5 стучит в наши двери вместо файлов cookie, я бы, вероятно, использовал HTML5 Local Storage и если браузер не поддерживает его резервное копирование в файлы cookie.

Ответ 2

Как отметил Дарин, локальное хранилище может быть вариантом, но файлы cookie более широко поддерживаются, и механизм резервного копирования, безусловно, будет работать.

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

Если вы используете ORM, например, NHibernate, явное кэширование в приложении, вероятно, не является чем-то, что вам нужно будет очень беспокоиться, поскольку данные будут кэшироваться провайдером кэширования ORM (доступны локальные или распределенные параметры).

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

Ответ 3

Вы имеете в виду: "Я не хочу писать один и тот же код в каждом действии, чтобы загрузить мои пользовательские данные и передать его в представление, которое будет отображать частичное представление вместо этого??

Если да, то измените RenderPartial на RenderAction и поместите свою логику для получения статистики пользователя из db.

Но этот код будет выполняться каждый раз, когда пользователь запрашивает страницу.

Возможно, вам стоит рассмотреть возможность размещения значений в HttpCache (http://msdn.microsoft.com/en-us/library/aa478965.aspx), поэтому вам не нужно обращаться к db для каждого запроса.