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

Chr*_*ini 1 ruby-on-rails race-condition counter-cache ruby-on-rails-3

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

使用一个Web实例可以轻松实现一致性.但是在多个实例运行时,可能会出现竞争条件.

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

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

任何想法将不胜感激.

mu *_*ort 5

你可以使用update_counter:

increment_counter(counter_name,id)

将数字字段递增1,通常表示计数.

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

update models set c = coalesce(c, 0) + 1 where id = 11
Run Code Online (Sandbox Code Playgroud)

所以你不必担心比赛条件.让数据库完成它的工作.

  • @ChristianFazzini:是的,几十年前RDBM解决了这个问题. (3认同)
  • 好吧,拿着你的短裤.不需要讽刺 (2认同)