Каков хороший дизайн для кэширования результатов дорогого поиска в системе ASP.NET?
Будут приветствоваться любые идеи ... особенно те, которые не требуют изобретения собственной сложной инфраструктуры.
Вот некоторые общие требования, связанные с проблемой:
- Каждый результат поиска может содержать от нуля до нескольких сотен записей результатов
- Каждый поиск обходится относительно дорого и требует много времени (5-15 секунд в базе данных)
- Результаты должны быть разбиты на страницы перед отображением на клиенте, чтобы избежать информационной перегрузки для пользователя
- Пользователи ожидают, что смогут сортировать, фильтровать и искать в результатах поиска
- Пользователи ожидают, что смогут быстро переключаться между страницами в результатах поиска
- Пользователи ожидают, что смогут выбрать несколько элементов (с помощью флажка) на любом количестве страниц
- Пользователи ожидают относительно высокой производительности после завершения поиска
Я вижу несколько возможных вариантов, где и как реализовать кэширование:
1. Кэшируйте на сервере (в сеансе или в кэше приложений), используйте постбэки или панели Ajax для упрощения разбиения на страницы, сортировки, фильтрации и поиска.
- PROS : Простота реализации, достойная поддержка инфраструктуры ASP.NET
- CONS : очень болтливый, много памяти на сервере, данные могут кэшироваться дольше, чем необходимо; запрещает методы балансировки нагрузки
2. Кэшируйте на сервере (как указано выше), но используйте сериализуемые структуры, которые перемещаются из памяти через некоторое время, чтобы уменьшить нагрузку на сервер
- PROS : эффективное использование памяти сервера; возможность масштабирования с использованием балансировки нагрузки;
- CONS : ограниченная поддержка инфраструктуры .NET; потенциально хрупкий при изменении структуры данных; размещает дополнительную нагрузку на базу данных; значительно сложнее
3. Кэшируйте на клиенте (используя сериализацию JSON или XML), используйте клиентский Javascript для разбивки на страницы, сортировки, фильтрации и выбора результатов.
- PROS : взаимодействие с пользователем может приблизиться к уровню «богатого клиента»; большинство браузеров могут обрабатывать JSON / XML изначально - для манипулирования существуют приличные библиотеки (например, jQuery)
- CONS : загрузка начального запроса может занять много времени; значительный объем памяти на клиентских машинах; потребует ручной Javascript на каком-то уровне для реализации
4. Кэшируйте на клиенте, используя сжатое / закодированное представление данных - перезвоните на сервер для декодирования при переключении страниц, сортировке, фильтрации и поиске.
- PROS : минимизировано влияние памяти на сервер; позволяет государству жить столько, сколько нужно клиенту; немного улучшенное использование памяти на клиенте по сравнению с JSON / XML
- CONS : большие наборы данных, перемещающиеся назад и вперед между клиентом / сервером; более низкая производительность (из-за сетевого ввода-вывода) по сравнению с чистым кэшированием на стороне клиента с использованием JSON / XML; гораздо сложнее в реализации - ограниченная поддержка .NET / browser
5. Некоторые альтернативные схемы кэширования, которые я не рассматривал ...