Реализация объектного кеширования в классическом ASP с утечкой памяти - PullRequest
2 голосов
/ 10 августа 2009

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

Мой подход был такой:

Создайте глобальный объект HashTable в global.asa, где я позже сохраню jscript-объекты в

<object id="SIZE_LIST" progid="System.Collections.HashTable" runat="Server" scope="Application"></object>

Это дает мне глобальный HashTable-объект, который я через определенные промежутки времени заменяю содержимым HashTable. Размер будет незначительно отличаться, но я, однако, каждый раз делаю .Remove () и .Add () для всех объектов.

Это работает очень хорошо, кроме того факта, что через некоторое время распределение памяти в приложении становится высоким, что приводит к иррациональному поведению сеансов. Он «забудет» сессии, но не вызовет OnSessionStart () в global.asa. Для этого оставляем посетителей с пустой сессионной коллекцией.

Можно ли как-то улучшить процесс перераспределения памяти? Есть ли лучший подход для объектного кэширования?

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

Ответы [ 4 ]

1 голос
/ 10 августа 2009

Каковы причины использования .NET HashTable поверх обычного Scripting.Dictionary?

Когда вы делаете классический ASP, почему обычного COM-объекта будет недостаточно?

0 голосов
/ 22 декабря 2009

Я бы выбрал более низкотехнологичный подход и сохранял бы каждый объект отдельно (со строковыми ключами) в объекте Application. Таким образом, у вас не будет единственного огромного объекта с точки зрения скриптового движка. Как вы думаете, это поможет?

0 голосов
/ 11 августа 2009

Это только предположение, но, возможно, из-за того, что вы сохраняете объекты JScript в .net Hash, вы все равно можете хранить ссылку на объект, чтобы сборщик мусора никогда не получал шанса выполнить свою работу должным образом.

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

Если вас беспокоит устаревание ваших данных, вы можете использовать серверную часть XMLHTTPRequest (что удивительно быстро), чтобы вызвать страницу aspx, которая выполнит поиск и вернет вам строку JSON. Страница aspx может обрабатывать кеширование с помощью фантастического кеширования .net и может даже сжать строку JSON с помощью SharpZipLib, прежде чем сохранить ее в кеше, чтобы еще больше уменьшить объем памяти. Что также является хорошим трюком для сохранения файлов XML в кеше (от 600 КБ до 25 КБ за 0,0016 секунды!)

Мы уже использовали все вышеперечисленное в проектах, не идеальное, но достаточно хорошее решение, основанное на ограничениях и устаревшем коде того времени. И все они очень-очень быстрые (хорошо, не по стандартам .net, а для написания скриптов очень быстро).

0 голосов
/ 10 августа 2009

не пытайтесь изобретать велосипед. Используйте memcache. Это бесплатно и легко установить. В качестве бонуса имеет ttl (время жизни) и работает за пределами сервера

...