Могу ли я использовать элемент управления «OutputCache» ASP.NET для кэширования изображений без снижения производительности?

У меня есть некоторые действия ASP.NET MVC, которые динамически генерируют изображения (хотя это также может быть страница ASPX).

Я использую [OutputCache] для кеширования этих изображений. Мне просто интересно, нужно ли мне беспокоиться о кэшировании изображений ASP.NET в памяти и использовании слишком большого количества ресурсов. Это изображения продуктов разного размера для корзины, содержащей всего пару десятков продуктов.

Будет ли OutputCache использовать диск или только в памяти? Насколько это умно? Или я должен просто сохранить изображения на диск и реализовать свою собственную систему кеширования (которая на самом деле является текущей реализацией)?


person Simon_Weaver    schedule 28.01.2009    source источник
comment
Извините, что столкнулся с этим, но у меня такая же ситуация - вам пришлось откатывать собственную реализацию кеша? Я обслуживаю свои изображения с выделенных серверов, поэтому у меня нет доступа к этим экземплярам IIS со своей страницы загрузки, и я бы предпочел не связываться напрямую с файловой системой при попытке аннулировать записи кеша. Вы нашли решение этой проблемы?   -  person Daniel Schierbeck    schedule 29.04.2010
comment
Я закончил тем, что сам сохранил изображения в каталог кеша в первый раз, когда они были запрошены, но теперь я практически перестал генерировать динамические изображения, за исключением небольших, которые меня не беспокоят. плюс мы перешли на новый сервер с 8 ГБ вместо 2 ГБ. перечитав свой первоначальный вопрос, я был бы удивлен, если бы outputcache использовал диск (кроме виртуальной памяти).   -  person Simon_Weaver    schedule 29.04.2010


Ответы (1)


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

Мне приходилось делать что-то подобное в прошлом, и я фактически реализовал двухуровневую систему, которая в основном использовала кеш HTTP, а файловую систему использовал как запасной вариант. Если чего-то не было, я сгенерировал изображение, сохранил его на диск и поместил в кеш. Таким образом, если он выталкивается из кеша или пул приложений перезагружается, мне нужно только загрузить его с диска (похоже, вы сделали то же самое).

Что касается «слишком много памяти», если вы явно используете HttpContext.Cache вместо [OutputCache], вы можете контролировать приоритет элемента в кеше. Затем вы можете настроить параметры пула приложений, чтобы контролировать, сколько памяти он использует в целом, но я не уверен, что еще много чего нужно сделать, кроме этого. Пара изображений * 12 продуктов мне не кажется, что это займет много памяти.

Мне кажется, что ничего не зная о вашем приложении, вы могли бы обойтись простым использованием кэша вывода. Однако, если вам нужно что-то более надежное и масштабируемое, я бы использовал описанную мною двухуровневую систему. Хотя, если у вас это уже реализовано и работает, «если оно не сломано ...»

person Daniel Schaffer    schedule 28.01.2009
comment
сейчас реализация запутана, потому что имя файла представляет собой объединение ключа изображения, желаемых размеров и других параметров. Я не хочу тратить целый день на написание какого-нибудь умного механизма кеширования, если мне удастся обойтись одной строчкой кода. думаю, мне, вероятно, следует просто контролировать использование памяти IIS - person Simon_Weaver; 29.01.2009