2017-01-25 3 views
0

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

Существует также список категорий.

Каждый товар относится к категории.

Когда список продуктов обновлений, я запускаю функцию updateProductsCategories(), который запрашивает базу данных, вычисляет количество товаров в каждой категории, и возвращает список, как это:

Food: 20 
Drinks: 74 
Jackets: 15 

я использую этот список на веб-странице чтобы показать категории как ссылки с количеством продуктов в нем.

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

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

Поскольку объект невелик, я не думаю, что мне нужны дополнительные решения, такие как Redis.

Это правильный и распространенный способ оптимизации приложения? Будет ли она добавлять скорость в приложение в реальном мире?

+0

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

ответ

1

Если:

  • вам нужна статистика часто (количество товаров в каждой категории)
    и/или эквайринг статистика занимает относительно много времени/нагрузок
  • обновления
  • и продукта является «нечастым» (по сравнению с тем, как часто вам нужна статистика)

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

Вещи, чтобы иметь в виду:

  • доступ к этим статистике должны быть синхронизированы, как веб-запросы обслуживаются на нескольких goroutines
  • если у вас есть несколько экземпляров сервера, эта статистика может стать неточным; В этом случае вам нужен центральный кэш, как Redis
0

Является ли это правильный и простой способ оптимизировать приложение?

Я считаю, что чаще всего этот подход используется для простых запросов, которые не дают больших объемов данных. Сложные запросы или все, что требуется для сеанса пользователя, лучше в общем кэше. Как отметил @icza, наличие нескольких экземпляров сервера должно заставить вас задуматься о том, оптимально ли ваше решение.

Будет ли оно добавлять скорость в приложение в реальном мире?

В вашем случае, да, немного.

Смежные вопросы