У меня есть веб-сайт, который позволяет пользователям запрашивать определенные рецепты, используя различные критерии поиска.Например, вы можете сказать: «Покажите мне все рецепты, которые я могу сделать менее чем за 30 минут, которые будут использовать курицу, чеснок и макароны, но не оливковое масло».
Этот запрос отправляется на веб-сервер через JSON,и десериализован в объект SearchQuery
(который имеет различные свойства, массивы и т. д.).
Сам фактический запрос к базе данных довольно дорогой, и существует множество шаблонов поиска по умолчанию, которые будут использоваться довольно часто.По этой причине я хотел бы начать кэширование общих запросов.Я провел небольшое исследование различных технологий кеширования и прочитал множество других SO-сообщений на эту тему, но я все еще ищу советы о том, какой путь выбрать.Сейчас я рассматриваю следующие варианты:
- Встроенный
System.Web.Caching
: Это обеспечит большой контроль над количеством элементов в кэше, когда ониистекает, и их приоритет.Однако кэшированные объекты обозначаются строкой, а не хеш-объектом.Мало того, что мне нужно было бы иметь возможность конвертировать SearchQuery
объект в строку, но хеш должен быть идеальным и не вызывать никаких коллизий. - Разработать мой собственный кэш InMemory: Что мне действительно нравится, так это
Dictionary<SearchQuery, Results>
объект, который сохраняется в памяти во всех сеансах.Так как результаты поиска могут начать становиться достаточно большими, я хотел бы иметь возможность ограничить количество запросов, которые будут кэшироваться, и предоставить способ истечения старых запросов.Что-то вроде очереди FIFO будет хорошо работать здесь.Я беспокоюсь о таких вещах, как безопасность потоков, и мне интересно, стоит ли здесь писать свой собственный кеш.
Я также изучал некоторые сторонние поставщики кеша, такие как NCache и Скорость .Оба они являются поставщиками распределенного кэша и, вероятно, полностью лишены того, что мне нужно в данный момент.Кроме того, кажется, что каждая система кеша, которую я видел, все еще требует, чтобы объекты были обозначены строкой.В идеале я хочу что-то, что удерживает кэш в процессе, позволяет мне задавать ключ по хэш-значению объекта и позволяет контролировать время и приоритеты истечения срока действия.
Буду признателен за любые советы или ссылки на бесплатные и желательнорешения с открытым исходным кодом, которые могли бы помочь мне здесь.Спасибо!