如何持续增加计数器缓存列?

时间:2012-08-11 00:56:17

标签: ruby-on-rails ruby-on-rails-3 race-condition counter-cache

假设我有一个计数器缓存,需要在每次页面加载时递增。假设我有10个Web实例。如何持续增加计数器缓存列?

使用一个Web实例,一致性很容易。但是在多个实例运行时,可能会出现竞争条件。

这是一个快速解释。假设我的计数器缓存列称为foo_counts,其起始值为0.如果同时加载2个Web实例,则两者都将计数视为0.当需要增加计数时。它们都将计数从0递增到1。

我看了http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update

非常感谢任何想法。

2 个答案:

答案 0 :(得分:5)

您可以使用update_counter

  

increment_counter(counter_name,id)

     

将数字字段增加1,通常表示计数。

这在SQL中执行直接更新,因此Model.increment_counter(:c, 11)将此SQL发送到数据库:

update models set c = coalesce(c, 0) + 1 where id = 11

所以你不必担心竞争条件。让数据库完成它的工作。

答案 1 :(得分:0)

考虑对增量进行排队,让工作人员在后台进行实际增量。你不会有完全高达毫秒的数据,但至少它是准确的。