Должен ли я кешировать данные или попасть в базу данных?


10

Я не работал с какими-либо механизмами кэширования и мне было интересно, какие у меня есть варианты в мире .net для следующего сценария.

В основном у нас есть служба REST, в которой пользователь передает идентификатор категории (папка Think), и в этой категории может быть много подкатегорий, и каждая из подкатегорий может иметь 1000 медиа-контейнеров (объектов ссылок на файл Think), которые содержат информацию о файл, который может находиться на сервере NAS или SAN (в данном случае это видео). Связь между этими категориями хранится в базе данных вместе с некоторыми правилами разрешений и метаданными о подкатегориях.

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

Количество пользователей может вырасти до 1000-х, а подкатегории и видео могут быть в 10000-х по мере роста системы.

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

Мы используем IIS 6/7 и Asp.net.


4
Вы профилировали свою систему под реальной нагрузкой? Можно ли кэшировать данные? Будет ли это иметь смысл?

Ответы:


13

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

Далее нужно знать ответ на следующий вопрос:

1) Будут ли данные часто меняться? 2) Часто ли приложение опрашивает вашу службу REST, чтобы получить эти обновления? 3) База данных используется для других целей? 4) Знаете ли вы о текущих проблемах производительности? 5) Обновляются ли данные вашим приложением и нужно ли отражать эти обновления в приложении?

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

Так что спросите себя, что вы надеетесь получить, обмениваясь поставщиками кэша? И какие текущие ограничения необходимо устранить?

Если вы не испытываете никаких замедлений, я бы просто сказал: «Нет, переключаться не нужно».

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

Сейчас я делаю проект, в котором принимаю точно такие же решения.

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

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


Спасибо Ян. На данном этапе у нас есть база данных, но это был скорее образовательный вопрос о том, на что нужно обратить внимание.
JD01

18

По словам Торбьерна, на самом деле не хватает информации.

Кэширование, если оно выполнено неправильно, может причинить вам и вашим пользователям много горя. Убедитесь, что вам нужно беспокоиться о кэшировании, прежде чем усложнять приложение.

Таким образом, при отсутствии информации, указывающей на то, что вам действительно нужно кешировать, не кешируйте.

[Общее правило оптимизации: если вам нужно спросить, должен ли я что-то сделать, ответ - нет] *
* В большинстве случаев ответом будет «да», а не утверждение.


Люблю общее правило, хорошо сказано :)
Ян

@ dan-mcgrath Это хорошая идея для кэширования записей, если я собираюсь получить доступ к каждой записи ровно 2 раза только в течение, скажем, 5 минут и никогда после этого?
nishantbhardwaj2002
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.