像Humble Bundle这样的实时销售柜台?

时间:2011-12-16 17:04:22

标签: ruby-on-rails caching real-time

我正在寻找一个随着更多数据库条目(销售)的创建而更新的实时计数器(例如,http://www.humblebundle.com)。我试图不对数据库施加不必要的压力。

一种天真的方法就是每隔一秒左右对数据库执行销售计数,并使用javascript实时更新数字。这会给数据库带来太大的压力并且不可行,但这是我试图实现的基本效果。

我能想到的另一种方法是以某种方式将销售数量存储在缓存而不是数据库中,然后在每次销售时向此缓存添加+1。然后,计数器每秒都会使用缓存计数的新值进行更新。这似乎可能会更好,但我不知道如何在Rails中实现这一点。

我在Heroku上使用Rails 3.1和jQuery,但我主要只是寻找一种高级方法来做到这一点。当然,您可以提供的细节越多越好:)

2 个答案:

答案 0 :(得分:3)

这不是缓存问题,而是数据反规范化问题。如果你有一个具有正确值的记录,那么读取该值是微不足道的,即使每秒进行数百次也不会花费时间。你可以确定它的基准。

使用after_create挂钩通常很容易做到这一点,你可以在这里做一些价值:

after_create :update_sales_total

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

如果您需要缓存,因为数据库性能不令人满意,请使用带有Memcache的Rails.cache工具作为存储,以便在Rails实例之间共享此数据。每次记录销售时,请将适当的金额添加到缓存值。如果未填充缓存,请从数据库中提取总和。

答案 1 :(得分:0)

缓存的想法是最好的。您可以轻松地每5分钟缓存一次当前销售额,并开始生成所有轮询值的数据集。您可以使用该数据集生成平均销售率,并根据略低于估计的销售率,通过每5分钟对缓存进行一次实际轮询,自动增加销售柜台。无论如何,count(*)实际上并不是一个缓慢的操作,至少在postgresql中,如果你没有高级过滤器,我甚至不认为它需要扫描所有元素。