TL; DR: что, вероятно, быстрее: доступ к статической локальной переменной, доступ к переменной, хранящейся в HttpRuntime.Cache, или доступ к переменной, хранящейся в memcached?
На работе мы получаем около200 000 просмотров страниц в день.На нашей домашней странице мы показываем продвижение.Это продвижение по-разному для разных пользователей, в зависимости от страны их происхождения и языка.
Все различные продвижение определены в файле XML на каждом веб-сервере.У нас есть 12 веб-серверов, обслуживающих один и тот же сайт с одним и тем же XML-файлом.Существует около 50 различных рекламных комбинаций в зависимости от страны / языка.Мы предполагаем, что у нас никогда не будет более 200 (если вообще когда-либо) рекламных акций (комбинаций).
Файл XML может быть изменен в любое время вне цикла выпуска.Когда это изменилось, новые определения промо-акций должны немедленно измениться на живом сайте.Реализация функциональности для этого требования является обязанностью другого разработчика и меня.
Первоначально я написал код так, чтобы содержимое файла XML было проанализировано и затем сохранено в статическом члене класса.FileSystemWatcher
отслеживал изменения в файле, и всякий раз, когда файл изменялся, XML-файл перезагружался / анализировался, и статический член обновлялся с новым содержимым.Выглядело как надежное и простое решение для поддержания словаря рекламных акций в памяти в актуальном состоянии с файлом XML.(Каждый сервер делает это независимо со своей локальной копией XML-файла; все XML-файлы одинаковы и изменяются одновременно.)
Другой разработчик, с которым я работал, занимал должность старшего и решил, что этоне было ничего хорошегоВместо этого мы должны хранить все рекламные акции на каждом сервере HttpContext.Current.Cache
с зависимостью файла CacheDependency
, которая автоматически отслеживает изменения файла, удаляя кэшированные рекламные акции при изменении файла.Хотя мне нравилось, что нам больше не приходилось использовать FileSystemWatcher
, я немного волновался, что захват повышений из кэша volitile вместо статического члена класса будет менее производительным.
(Не забудьте прокомментировать этобеспокойство? Я уже отказался от попыток запретить переход на HttpRuntime.Cache.)
Позже, после того как мы начали использовать HttpRuntime.Cache
, мы приняли memcached с Enyim в качестве интерфейса .NET для других бизнес-задач (например, поискРезультаты).Когда мы это сделали, этот старший разработчик решил, что мы должны использовать memcached вместо HttpRuntime
(HttpContext
) Cache
для хранения рекламных акций.Представители высшего звена сказали «да, звучит хорошо» и дали ему выделенный сервер с memcached только для этих рекламных акций.Сейчас он внедряет изменения, чтобы использовать memcached вместо этого.
Я скептически отношусь к тому, что это хорошее решение.Вместо того, чтобы оставаться в процессе и получать эти рекламные данные с HttpRuntime.Cache
, мы теперь открываем сокет для сетевого сервера memcached и передаем его значение на наш веб-сервер.
Это должно быть менее производительным, право?Даже если кеш мемкашируется.(У меня еще не было возможности скомпилировать какие-либо показатели производительности.)
Кроме того, ему придется разработать собственное решение для файловой зависимости по memcached, поскольку оно не предоставляет такой возможности.
Разве мой оригинальный дизайн не будет лучшим?Вам кажется, что это слишком высокий уровень подготовки?HttpRuntime.Cache
кэширование или memcached кэширование даже необходимо?