Ruby on rails 如何持续增加计数器缓存列?
假设我有一个计数器缓存,它需要在每次页面加载时递增。假设我有10个web实例。如何持续增加计数器缓存列 一个web实例很容易实现一致性。但在多个实例运行时,可能会出现竞争条件 这里有一个快速的解释。假设我的计数器缓存列名为Ruby on rails 如何持续增加计数器缓存列?,ruby-on-rails,ruby-on-rails-3,race-condition,counter-cache,Ruby On Rails,Ruby On Rails 3,Race Condition,Counter Cache,假设我有一个计数器缓存,它需要在每次页面加载时递增。假设我有10个web实例。如何持续增加计数器缓存列 一个web实例很容易实现一致性。但在多个实例运行时,可能会出现竞争条件 这里有一个快速的解释。假设我的计数器缓存列名为foo_counts,其起始值为0。如果同时加载两个web实例,则两个实例的计数均为0。当需要增加计数时。它们都将计数从0增加到1 我看着 任何想法都将不胜感激。考虑将增量排队,并让工人在后台执行实际的增量。你不会有完全达到毫秒的数据,但至少它是准确的。考虑将增量排队,并让工作
foo_counts
,其起始值为0。如果同时加载两个web实例,则两个实例的计数均为0。当需要增加计数时。它们都将计数从0增加到1
我看着
任何想法都将不胜感激。考虑将增量排队,并让工人在后台执行实际的增量。你不会有完全达到毫秒的数据,但至少它是准确的。考虑将增量排队,并让工作人员在后台执行实际的增量。您不会有完全达到毫秒的数据,但至少它是准确的。您可以使用: 递增计数器(计数器名称、id) 将数字字段增加1,通常表示计数 这在SQL so
模型中直接更新。增量计数器(:c,11)
将此SQL发送到数据库:
update models set c = coalesce(c, 0) + 1 where id = 11
所以你不必担心比赛条件。让数据库完成它的工作。您可以使用:
递增计数器(计数器名称、id)
将数字字段增加1,通常表示计数
这在SQL so模型中直接更新。增量计数器(:c,11)
将此SQL发送到数据库:
update models set c = coalesce(c, 0) + 1 where id = 11
所以你不必担心比赛条件。让数据库完成它的工作。我考虑过这个问题。我可以将
rescue ActiveRecord::StaleObjectError
放入工作程序中,然后再次将作业排队。但这意味着会有几个工人在后台工作。考虑到每一次页面加载都要这样做,这意味着需要大量的工作人员。另一种可能是不使用sql跟踪它,而是使用redis之类的原子命令,它可以轻松地处理几乎所有您需要的写入负载。您建议使用什么工具来跟踪web应用程序上的长期指标?长期,您需要的三件事是高写性能、易共享性,以及在数据集上运行查询以实际获取分析的能力。SQL在小型数据库中运行良好,具有很强的可查询性。在其他两个类别中就不那么热门了。通常,您将即时数据存储在具有高写入性能的对象中,如redis或cassandra,然后将该数据移动到允许map reduce查询的对象中,如hadoop。在你所处的位置上,这种设置几乎肯定是过火了。现在就使用SQL,但要有一个计划,当你超越它的时候可以执行。我考虑过这一点。我可以将rescue ActiveRecord::StaleObjectError
放入工作程序中,然后再次将作业排队。但这意味着会有几个工人在后台工作。考虑到每一次页面加载都要这样做,这意味着需要大量的工作人员。另一种可能是不使用sql跟踪它,而是使用redis之类的原子命令,它可以轻松地处理几乎所有您需要的写入负载。您建议使用什么工具来跟踪web应用程序上的长期指标?长期,您需要的三件事是高写性能、易共享性,以及在数据集上运行查询以实际获取分析的能力。SQL在小型数据库中运行良好,具有很强的可查询性。在其他两个类别中就不那么热门了。通常,您将即时数据存储在具有高写入性能的对象中,如redis或cassandra,然后将该数据移动到允许map reduce查询的对象中,如hadoop。在你所处的位置上,这种设置几乎肯定是过火了。现在就使用SQL,但要有一个计划,当你超越它的时候可以执行。嗯,很有趣。那么数据库会执行自己的锁定/查询吗?我只是想大声说出来。如果使用此方法同时抛出多个更新会怎么样。计数持续更新吗?@ChristianFazzini:是的,RDBMs在几十年前解决了这个问题。嗯,很有趣。那么数据库会执行自己的锁定/查询吗?我只是想大声说出来。如果使用此方法同时抛出多个更新会怎么样。计数是否持续更新?@ChristianFazzini:是的,RDBMs在几十年前就解决了这个问题。