1

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

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

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

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

任何想法将不胜感激。

4

2 回答 2

5

你可以使用update_counter

增量计数器(计数器名称,ID)

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

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

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

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

于 2012-08-11T01:31:59.773 回答
0

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

于 2012-08-11T01:02:49.007 回答