Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 实时销售柜台,比如谦逊包?_Ruby On Rails_Caching_Real Time - Fatal编程技术网

Ruby on rails 实时销售柜台,比如谦逊包?

Ruby on rails 实时销售柜台,比如谦逊包?,ruby-on-rails,caching,real-time,Ruby On Rails,Caching,Real Time,我正在寻找一个实时计数器,它会随着更多数据库条目(销售)的创建而更新(例如,)。我尽量不给数据库带来不必要的压力 一种简单的方法是每隔一秒左右ping一次数据库中的销售计数,然后用javascript实时更新数字。这将给数据库带来太多的压力,而且不可行,但这是我试图实现的基本效果 我能想到的另一种方法是以某种方式将销售编号存储在缓存中,而不是存储在数据库中,然后在每次销售时将+1添加到此缓存中。然后,计数器每秒都会用缓存计数的新值进行更新。这似乎可以更好地工作,但我不知道如何在Rails中具体实

我正在寻找一个实时计数器,它会随着更多数据库条目(销售)的创建而更新(例如,)。我尽量不给数据库带来不必要的压力

一种简单的方法是每隔一秒左右ping一次数据库中的销售计数,然后用javascript实时更新数字。这将给数据库带来太多的压力,而且不可行,但这是我试图实现的基本效果

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


我在Heroku上使用Rails3.1和jQuery,但我主要是寻找一种高级方法来实现这一点。当然,您可以提供的详细信息越多越好:)

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

这不是缓存问题,而是数据去规范化问题。如果您有一个包含正确值的记录,那么读取该值非常简单,即使每秒执行数百次,也不会花费时间。您可以确定它的基准

通常,在创建
后使用
钩子可以轻松实现这一点,您可以在钩子中旋转一些值:

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实例之间共享此数据。每次记录销售时,将适当的金额添加到缓存的值中。如果缓存未填充,则从数据库中提取总和。

每五分钟听起来不是很实时。javascript估算提供了实时感,而没有持续查询的性能。但同样,查询可以很容易地访问文件,因此它只是一个普通的http请求。cron作业可以很容易地进行计数。哦,你是说在客户端推断并伪造它。你的回答不清楚。