Подходы к кешированию большого количества объектов (кеш ASP.NET против статических объектов и кеширование объектов по отдельности в качестве словаря)
Я пишу элемент управления, который отображает список элементов на странице. База данных содержит (скажем, 50000 элементов), которые связаны (многие со многими) с (скажем, 1000) страницами.
Вместо того, чтобы писать хранимую процедуру для возврата набора полных элементов для данной страницы из базы данных (т. Е. Всех столбцов для гидратации списка объектов элементов), я думаю сделать следующее для визуализации списка:
- при запуске приложения, кэширование всех элементов списка
- заставить SP вернуть только ключевое значение для предметов
- циклический просмотр списка ключей и извлечение соответствующего объекта из кэша
Предварительные тесты показывают, что это выполняется быстрее, чем увлажнение списка из БД для каждого запроса страницы. Похоже, что это также приводит к меньшему общему потреблению памяти, поскольку каждый запрос страницы просто просматривает существующие объекты, в отличие от каждого запроса, создающего личный список (когда трафик высокий и запрашиваются большие страницы, потребление памяти становится очень высоким).
Так что теперь я обсуждаю с другими разработчиками, как реализовать кеш. У нас есть несколько вариантов, и я буду признателен за ваше мнение:
- Используйте ASP.NET HttpContext.Current.Cache
- Используйте статические / одиночные объекты
Внутри каждого из них также есть выбор:
- Кэшировать каждый объект предмета индивидуально
- Создайте словарь (или аналогичный список), содержащий все объекты элементов, затем кэшируйте словарь
Производительность чтения - главная проблема. Техническое обслуживание является второстепенной задачей - мы должны написать наши методы GetItems для защиты, чтобы проверить, есть ли каждый элемент в кеше, и если нет, извлечь его из БД и вставить в кеш.
Я знаю, что нет правильного ответа... есть плюсы и минусы для всего. Я просто смотрю, есть ли у людей подводные камни, о которых они могут рассказать о чем-либо из вышеперечисленного, или же любой подход выделяется как наиболее эффективный или особенно сложен для объединения новых данных.
Спасибо
1 ответ
Я хотел бы пойти с подходом кеша. Некоторые из причин:
- Вы можете контролировать, как долго объект будет храниться в кэше до освобождения памяти. При большой нагрузке сервер может лучше реагировать.
- Если оно того стоит, я могу даже пойти дальше и использовать какой-то распределенный кэш, чтобы он выдержал перезапуск пула приложений. Memcache и NCache приходят на ум.
Мне не нравится подход Singleton. Мне кажется, что вы будете изобретать велосипед заново, когда сможете идеально использовать для этого Cache. Параллельность будет такой же проблемой, как и с Cache, и вы потеряете гибкость использования распределенного Cache. Какой бы подход вы ни выбрали, я бы создал класс-обертку для хранения и извлечения объектов из Cache, что позволило бы вам легко и без проблем перейти от традиционного Cache к распределенному Cache в будущем.