Недостатки кэширования в памяти преобразованного XML? - PullRequest
4 голосов
/ 18 августа 2010

Я пишу веб-приложение, которое постоянно извлекает XML-компоненты из базы данных, а затем преобразует их в XHTML с помощью XSLT. Некоторые из этих преобразований происходят часто (например, компонент «навигация по боковой панели» отключается для одного и того же XML и выполняет одно и то же XSL-преобразование на каждой странице с этой боковой панелью), поэтому я начал реализовывать некоторое кэширование для ускорения процесса.

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

Объект CacheManager хранит в памяти сохраненный в кэше преобразованный XML (точнее, в Dictionary). В моей локальной среде разработки это работает прекрасно, но я предполагаю, что это может быть не очень масштабируемое решение.

Каковы возможные недостатки хранения этих данных в памяти? Нужно ли ограничивать объем данных, которые я могу хранить в структуре данных в памяти, подобной этой? Должен ли я использовать другое хранилище данных для этого типа кэширования в целом?

Ответы [ 3 ]

4 голосов
/ 18 августа 2010

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

Еще одна потенциальная (хотя и маловероятная) проблема, с которой вы можете столкнуться, - это стоимость копания в кэше, чтобы найтичто вам нужно.В какой-то момент может быть быстрее просто генерировать то, что вам нужно, а не просматривать кеш.Мы столкнулись с этим по крайней мере в одном точном сценарии, связанном с очень большими кэшами и очень дешевыми операциями.Это маловероятно, но это может произойти.

1 голос
/ 18 августа 2010

Вы можете выполнять кэширование, но сохранять только справочные значения (uri) в словаре и сохранять фактический преобразованный XML на диске.Вероятно, это будет быстрее, чем извлечение значений из базы данных и повторное преобразование, медленнее, чем сохранение всего этого в памяти, но сначала решает проблему хранения всех этих кэшированных данных в памяти.Это также может позволить преобразованным XML-документам выжить при перезапуске / перезапуске, но вам придется перестроить свой словарь, а также подумать об «истекающих» документах, которые необходимо удалить из дискового кэша.

Просто идея ..

1 голос
/ 18 августа 2010

Вы должны определенно искать общую реализацию chache.Я не делаю C #, поэтому я не знаю ни одного решения на вашем языке.В Java я бы порекомендовал EHCache.

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

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

В качестве примечания: пока вы кешируете свой XML после преобразования, вам, вероятно, следует хранить его строковое представление (а не дерево объектов).Это еще одно преобразование, которое нужно выполнить после кэша, так как вы, вероятно, все равно выводите его как String.И есть большая вероятность, что строковое представление займет меньше места (но, как всегда, измеряйте это, не поверьте мне на слово).

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