Хранить данные в сеансе, как и когда определять, устарели ли данные - PullRequest
0 голосов
/ 04 августа 2011

У меня есть такой сценарий.

  1. Пользователь выполняет поиск
  2. Обработчик находит результаты, сохраняет в сеансе
  3. Пользователь видит результаты, решает щелкнуть один из них для просмотра
  4. После просмотра пользователь нажимает «Вернуться к поиску»
  5. Обработчик обнаруживает спину к поиску, пропускает поиск и вместо этого извлекает из сеанса
  6. Пользователь видит те же результаты, что и ожидалось

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

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

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

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

Количество не будет 100%, потому что могут быть соответствующие удаления.

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

Сделайте это простым и повторите поиск.

1 голос
/ 04 августа 2011

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

Вместо этого у вас должна быть служба поиска синглтона, которая управляет собственным кешем. Хотя это похоже на стратегию кеширования внутри сеанса, у нее есть несколько преимуществ:

  • вы можете повторно использовать общие результаты поиска среди пользователей; в зависимости от типов поиска это может быть значительным
  • вы можете управлять размером кэша в слое сервиса; что-то наподобие ehcache легко внедряется и дает вам много возможностей для конфигурирования (и защиты от проблем с нехваткой памяти)
  • вы можете управлять валидностью кэша на уровне сервиса; то есть, если у службы «элемент обновления» был запущен метод save (), он может указать службе поиска сделать недействительной либо весь свой кеш, либо только кэшированные результаты, которые соответствуют недавно обновленному / созданному элементу.

Третий пункт выше касается вашего основного вопроса.

0 голосов
/ 04 августа 2011

Какую частоту обновления вы ожидаете в элементах БД?Изменились бы результаты поиска даже на короткие промежутки времени, потому что я не знаю такого сценария, но у вас может быть другой случай.

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

Теперь, когда пользователь хочет снова просмотреть результаты поиска, сравните отметки времени, т.е. сравнитеваша временная метка кеша с последним элементом, вставленным в БД.Если совпадений нет, то повторно запросите другое шоу из вашего кэша.

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

0 голосов
/ 04 августа 2011

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

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

Есть ли какие-либо новые результаты к тому времени, когда пользователь вернется туда?Вы можете просто нажать кнопку «Обновить» на страницах результатов поиска, чтобы снова запустить поиск.

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