ruby-on-rails 如何一致地增加计数器缓存列?

hmae6n7t  于 2023-06-25  发布在  Ruby
关注(0)|答案(2)|浏览(117)

假设我有一个计数器缓存,需要在每次加载页面时递增。假设我有10个Web示例。如何一致地增加计数器缓存列?
一个Web示例就可以轻松实现一致性。但在运行几个示例时,可能出现竞争条件。
这里有一个快速的解释。假设我的计数器缓存列名为foo_counts,其起始值为0。如果同时加载2个Web示例,则两者都实现计数为0。当它到了增加计数的时候。它们都将计数从0递增到1。
我看过http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update
任何想法将不胜感激。

kd3sttzy

kd3sttzy1#

可以使用increment_counter

increase_counter(counter_name,id)

将数字字段递增1,通常表示计数。
这在SQL中执行直接UPDATE,因此Model.increment_counter(:c, 11)将此SQL发送到数据库:

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

所以你不用担心比赛条件。让数据库做它的工作。

eoigrqb6

eoigrqb62#

考虑对增量进行排队,并让worker在后台执行实际的增量。您不会拥有完全高达毫秒的数据,但至少它将是准确的。

相关问题