Как сохранить часто используемые значения, не просматривая базу данных каждый раз?

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

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

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

Есть какие-нибудь предложения?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я работаю на сервере, где я не могу указать время ожидания сеанса самостоятельно. Кроме того, количество вопросов с ответами должно обновляться, когда пользователь отвечает на вопрос.

Комментарии:

1. класс кэша работает независимо от времени ожидания сеанса — смотрите ссылки в моем ответе…

Ответ №1:

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

Ответ №2:

Вы могли бы рассмотреть возможность увеличения времени ожидания сеанса.

Ответ №3:

Очень интересный ресурс о кэшировании и ASP.NET является http://msdn.microsoft.com/en-us/magazine/gg650661.aspx

Поскольку вы не можете указать время ожидания сеанса, используйте Cache класс — он поддерживает несколько разных механизмов для удаления кэшированного элемента…

РЕДАКТИРОВАТЬ — согласно комментарию:

С кэшем вы должны реализовать схему «сквозной записи», то есть всегда обновлять как кэш, так и БД, что означает, что кэш всегда правильный и любое чтение никогда не попадает в БД после начальной загрузки при запуске приложения.

Другой вариант — обновить базу данных и аннулировать элемент кэша … при следующем доступе на чтение вы получаете «промах кэша» и обрабатываете это, нажимая на DB и сохраняя результат в кэше … таким образом, вы обращаетесь к DB для чтения в worstcase так же часто, как и для записи… этот шаблон помогает только в том случае, если у вас намного больше операций чтения, чем записи…

Комментарии:

1. Когда количество вопросов с ответами обновляется (пользователь ответил на новый вопрос), кэш больше недействителен. Как бы вы обновили ее?

2. @Kenci как и в случае с каждым кэшем, вы должны реализовать схему «сквозной записи» (т. Е. всегда обновлять как кэш, так и БД).

3. @Kenci другой вариант — просто аннулировать кэшированное значение при обновлении и при следующем доступе для чтения проверить последовательность (если ее там нет, просто загрузите ее в кэш) и т.д.

4. Мне нравится ваш ответ и ваши усилия! Я не сохраняю количество вопросов, на которые даны ответы в базе данных, а вычисляю его, просматривая каждый вопрос, чтобы увидеть, были ли даны ответы на все варианты ответов, а затем суммирую все это. Поскольку у меня есть много вопросов и возможностей для ответов, это потребовало бы большого количества обращений к базе данных, что является AFAICS, чего потребовала бы схема сквозной записи. Я хочу получить число один раз, когда пользователь входит в систему, а затем обновить его в памяти. Я думаю, что соглашусь с ответом @Kae Verens, но спасибо за помощь. И поправьте меня, если я ошибаюсь.