Потоковое кеширование в ASP.NET HttpModules - PullRequest
1 голос
/ 17 июня 2011

Вот сценарий

У меня есть приложение ASP.NET 4.0, у которого МНОГО устаревших URL-адресов.Я хочу создать HTTP-модуль, который будет просматривать базу данных этих переписываний и, при необходимости, выполнять редирект 301.В этой таблице десятки тысяч записей.

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

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

Моя блестящая / нелепая идея состоит в том, чтобы

  1. При запуске приложения в моем HttpModule создать пустой словарь для перезаписей.
  2. Запуск фонового рабочего потока.Приложение продолжает запускаться.
  3. Фоновый рабочий поток обновляет словарь, скажем, о, 1000 наиболее часто используемых перезаписей.

Вопросы

Мои вопросы:

  1. Это смешно?
  2. Существует ли такая вещь, как потокобезопасный словарь?Фоновый поток может обновлять словарь при поступлении новых запросов.
  3. Замедляет ли вся блокировка, выполняемая в поточно-ориентированной коллекции, входящие запросы?

Спасибо!!

1 Ответ

4 голосов
/ 17 июня 2011

Если вы ориентируетесь на .NET 4.0, вы можете использовать ConcurrentDictionary, и он позаботится обо всей магии для вас с точки зрения параллелизма. Просто используйте GetOrAdd для входящих запросов и AddOrUpdate для вашей фоновой идеи.

Я также хотел бы предложить вам кое-что для размышления. Если у вас есть эти тысячи URL, вы действительно работаете только на одном сервере? Я спрашиваю об этом, потому что вы говорите только о локальной схеме кэширования здесь. Если у вас есть три сервера, все они будут обрабатывать базу данных для данных URL. Вы ищете технологию распределенного кэширования, такую ​​как Windows Server AppFabric или Memcached?

...