Счетчик продаж в режиме реального времени, как Humble Bundle? - PullRequest
1 голос
/ 16 декабря 2011

Я ищу счетчик реального времени, который обновляется по мере создания большего количества записей в базе данных (продажи) (например, http://www.humblebundle.com). Я пытаюсь не создавать ненужную нагрузку на базу данных.

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

Другой способ, который я могу придумать, - это каким-то образом сохранить номер продаж в кеше вместо базы данных, а затем добавлять +1 к этому кешу каждый раз, когдапродажа сделана. Затем счетчик обновляется каждую секунду с новым значением кэшированного счетчика. Кажется, он может работать намного лучше, но я не знаю, как конкретно это реализовать в Rails.

Я использую Rails 3.1 и jQuery на Heroku, но в основном я просто ищу высокоуровневый способ сделать это. Конечно, чем больше деталей вы можете предоставить, тем лучше:)

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

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

Обычно это легко сделать с помощью ловушки after_create, где вы перебираете какое-то значение:

after_create :update_sales_total

def update_sales_total
  # Update the simple summary record
  SalesTotal.update([ 'total=total+?', self.total ])
end

Если вам нужно кэшировать, потому что производительность базы данныхНеудовлетворительно, используйте средство Rails.cache с Memcache в качестве хранилища, чтобы эти данные распределялись между экземплярами Rails.Каждый раз, когда вы регистрируете продажу, добавляйте соответствующую сумму к кешированному значению.Если кэш не заполнен, извлеките сумму из базы данных.

0 голосов
/ 16 декабря 2011

Лучше всего кешировать. Вы можете легко кэшировать каждые 5 минут или около того объем текущих продаж и начать генерировать набор данных всех опрошенных значений. Вы можете использовать этот набор данных, чтобы сгенерировать средний уровень продаж, автоматически увеличивая счетчик продаж на основе чуть ниже предполагаемого уровня продаж с реальным опросом кэша каждые 5 минут. count (*) не очень медленная операция, по крайней мере, в postgresql я даже не думаю, что нужно буквально сканировать все элементы, если у вас нет расширенных фильтров.

...