Какова лучшая практика для кэширования постраничных результатов поиска, чей порядок / свойства могут быть изменены?
Скажем, в моем приложении кто-то хочет посмотреть последние 20 обсуждений (из 10000). Через базу данных будет отправлен запрос servlet
на выбор первых 20 записей из таблицы потоков обсуждений в формате XML / JSON. Если они затем хотят увидеть следующие 20, они переходят на следующую страницу результатов, и это запускает другой запрос на получение следующего лота (limit и offset = 20 и т. Д.).
Чтобы уменьшить нагрузку на сервер и ожидания клиентов, я бы хотел кешировать предыдущие страницы результатов. Однако у меня есть два вопроса:
- Таблица, в которой отображаются результаты, может быть упорядочена по нескольким атрибутам (т. Е. Дата создания потока, автор темы, дата последней публикации). Это означает, что утверждение типа «первые 20 результатов» не имеет смысла без контекста (то есть, по чему мы упорядочиваем). Как тогда интерфейс взаимодействует с тем, что он уже загрузил? Моей первой мыслью было использовать идентификаторы для каждого результата, но отправка их обратно на сервер при последующих запросах (и фильтрация результатов на их основе) будет так же трудоемкой, как отправка всех обратно вслепую. Как я могу это сделать?
- Что если атрибут ранее возвращенного результата (т. Е. Самая последняя дата публикации) изменился? Затем нам нужен способ проверки каждого результата, чтобы увидеть, был ли он изменен на стороне сервера с момента его подкачки. Как я могу это сделать?
ajax
caching
pagination
goodsquishy
источник
источник
Ответы:
Кажется , что вам нужно , это оболочка для всех параметров , которые определяют страницу (скажем,
pageNumber
,pageSize
,sortType
,totalCount
и т.д.) и использовать этотDataRequest
объект в качестве ключа для вашего механизма кэширования. С этого момента у вас есть несколько вариантов для обработки кэша:Первые два могут включать механизм планировщика для запуска на некотором интервале или на основе события. Последнее может быть проще, если у вас есть одна точка доступа к данным.
Наконец, как упоминал @DanPichelman, он может быстро стать слишком сложным алгоритмом, который перевешивает преимущества, поэтому убедитесь, что выигрыш в производительности оправдывает сложность алгоритма.
источник
Я бы, наверное, справился с этим так:
источник
Просто подумайте - при вызове вашего сервера передайте обычные параметры плюс массив хэшей MD5, представляющих кешированные ранее просмотренные страницы данных.
Обратный вызов будет содержать все обычные данные для новой текущей страницы, а также обновления для всех устаревших ранее просмотренных страниц. Вы можете использовать старый хеш в качестве ключа.
Сначала я бы порекомендовал много тестов производительности и синхронизации - ваш клиентский код будет намного сложнее, чем если бы вы просто нажимали на сервер для каждой страницы данных. Убедитесь, что дополнительная сложность приводит к значительному улучшению.
источник