Во-первых, я ценю, что этот вопрос можно рассматривать как субъективный, но я твердо верю, что на мой вопрос должен быть и, вероятно, окончательный ответ.
На работе мы в настоящее время реализуем стратегию динамического изменения размера иобслуживание изображений с использованием универсального обработчика, и вопрос кэширования стал чем-то спорным.
В моей первоначальной реализации измененное изображение кэшируется в памяти с зависимостью кэша, основанной на исходном изображении.
например,
using (MemoryStream ms = new MemoryStream())
{
imageEditor.Image.Save(ms, imageFormat);
// Add the file to the cache.
context.Cache.Insert(key,
ms.ToArray(),
new System.Web.Caching.CacheDependency(path)
);
imageEditor.Dispose();
// Set the context headers and serve.
SetHeaders(ms.GetHashCode(), context, responseType);
context.Response.BinaryWrite(ms.ToArray());
}
Это имеет свои недостатки, хотя.
- Каждый раз, когда рабочий процесс пула приложений перезапускается (по умолчанию каждые 1740 минут), мы будемпотерять все, что находится в кеше.
- Если изображений много, мы можем быть перегружены системной памятью и вызвать исключение нехватки памяти.(Предотвращает ли IIS это, перерабатывая пул приложений, если использование достигает определенного уровня?)
Один из моих коллег предложил вместо этого внедрить систему кэширования файлов, которая сохраняет измененный размер файла и служитэтот файл при последующих запросах, которые должны (я не знаю тонкостей управления кэшируемой памятью ввода-вывода операционной системы) уменьшить использование памяти.Несмотря на то, что это позволило бы нам сохранить измененное изображение на всех этапах повторения, я вижу несколько серьезных проблем с этим подходом:
- Мы больше не можем отслеживать исходный файл, поэтому, если кто-то загрузит новое изображение с тем же именемнаши измененные изображения будут неправильными.
- Файловый сервер со временем загрязняется тысячами изображений
- Чтение файла происходит медленнее, чем чтение из памяти.Особенно, если вы читаете несколько файлов.
Каков наилучший общий подход?Есть ли стандарт, определенный где-то в Microsoft?Сайты, которые мы создаем, как правило, очень заняты, поэтому нам бы очень хотелось, чтобы это было правильно и соответствовало самым лучшим стандартам.