Какая структура данных для кэширования запросов? - PullRequest
1 голос
/ 07 апреля 2011

Я ищу подходящую структуру данных для своего рода кэширования запросов для нашего веб-сервиса .net, который получает XML как запрос и возвращает XML как результат.

Процесс выглядит следующим образом: пользователь задает строку запроса (размером ~ 2 КБ) и получает результат (размером ~ 50 КБ). Последние n запросов с соответствующими результатами кэшируются, поэтому нам нужен запрос поиска O (1) -> результат. Если кэш заполнен (cache_size = n), самый старый элемент должен быть удален из кэша.

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

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

Нет ли более простого и эффективного решения для этой простой задачи?

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

System.Web.Caching поддерживает класс Cache с истечением по времени и максимальным ограничением в байтах.Для этого требуется .NET 4. Хотя.

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

1 голос
/ 07 апреля 2011

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

1 голос
/ 07 апреля 2011

Я бы предложил использовать существующее свойство HttpContext.Cache - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache.aspx

. Для более крупной / распределенной системы посмотрите на memcached (или memcacheddotnet - http://sourceforge.net/projects/memcacheddotnet/)

).Самостоятельно, рекомендуем инкапсулировать OrderedDictionary<> (http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx) - порядок добавления элементов сохраняется, так что вы можете получить доступ к первому / последнему и добавить в конец. Поиски словаря фиксированного размера будут O (1) Iповерьте. Дело в том, что он будет ограничен одним доменом приложений.

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