Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何持续增加计数器缓存列?_Ruby On Rails_Ruby On Rails 3_Race Condition_Counter Cache - Fatal编程技术网

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

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 我看着 任何想法都将不胜感激。考虑将增量排队,并让工人在后台执行实际的增量。你不会有完全达到毫秒的数据,但至少它是准确的。考虑将增量排队,并让工作

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

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

这里有一个快速的解释。假设我的计数器缓存列名为
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在几十年前就解决了这个问题。