Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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/8/mysql/56.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
Java 如何在基于MySQL的应用程序中有效地在用户上存储多个不同的计数器值?_Java_Mysql - Fatal编程技术网

Java 如何在基于MySQL的应用程序中有效地在用户上存储多个不同的计数器值?

Java 如何在基于MySQL的应用程序中有效地在用户上存储多个不同的计数器值?,java,mysql,Java,Mysql,我想为我的用户存储不同种类的计数器。 平台:Java 例如,我已确定: 当前数字记录 当前步数 currentNumFlowsInterval1440 currentNumFlowsInterval720 currentNumFlowsInterval240 currentNumFlowsInterval60 currentNumFlowsInterval30 等 上述每个计数器需要在每个月初为每个用户重置。每个计数器的值可能会高到无法预测的峰值等。我的意思是,很多事情都会被计算在内,所以我想考

我想为我的用户存储不同种类的计数器。 平台:Java

例如,我已确定:

当前数字记录 当前步数 currentNumFlowsInterval1440 currentNumFlowsInterval720 currentNumFlowsInterval240 currentNumFlowsInterval60 currentNumFlowsInterval30 等 上述每个计数器需要在每个月初为每个用户重置。每个计数器的值可能会高到无法预测的峰值等。我的意思是,很多事情都会被计算在内,所以我想考虑一个可扩展的解决方案

现在我的问题是采取什么方法来:

a我应该为用户表上的每个计数器设置单独的列,并执行诸如“更新集counterColumn=counterColumn+1”之类的操作吗

b将所有值放在某种JSON/XML中,并将其放在一列中?在这种情况下,我总是必须一次更新所有值

我看到的缺点是每次单个计数器递增时,用户表上的行都会被锁定

c有一个单独的计数器表,包含3列userid、name、counter,并为每个计数执行一次插入+有一个后台作业执行写入用户表的聚合?在这种情况下,可以将聚合计数器作为JSON存储在用户表的列中吗

d在MySQL中做任何事情还是使用其他技术?我还考虑使用另一种存储计数器的解决方案,只将聚合保存在MySQL中。例如,我用Apache Cassandra的分布式计数器进行了实验。我关心的是卡桑德拉没有的交易。 我需要精确的计数器,因为它们用于计费,因此我不知道Cassandra是否适合这里,尽管Cassandra的可扩展性似乎很诱人。 在MySQL中存储计数器+写入聚合的Redis怎么样?Redis有什么东西可以帮我吗?或者我应该将所有内容存储在内存中的一个简单Java HashMap中,并拥有一个聚合后台线程,而不使用其他技术

总而言之,我关注的是:

减少行锁定 有准确的交易记录吗?
谢谢你的想法:

你说的话有点矛盾

每个用户的计数数量可能很大,或者至少不可预测

对我来说,这意味着它们必须是一致的,就像一个数组。不可能有无限数量的异构数据,除非您有无限数量的代码和无限数量的开发人员时间

如果它们是统一的,则应将它们展平为一个表user\u counter,其中每一行的格式为user\u id、counter\u name、counter\u value。但是,您需要仔细考虑需要什么类型的索引,等等。如果它们都设置为零或某个默认值是一个SQL查询,则在月初进行更新


基本上是c。a和b是最荒谬的,MySQL仍然是一种合适的技术。

您的需求并不是那么不典型。一般来说,这是统计会话/用户/。。。绑定的书面数据

第一件事是,如果还没有这样做的话,就把事情分开。建立一个只读数据库,并分别收集这些数据。因此,为正常属性创建一个单独的用户表


统计数据可以保存在内存表中。您还可以使用数据库、消息队列、会话属性以外的其他方法。

我试图澄清我的问题。柜台是统一的。我只是想说,计数器值可能会高得无法预测。我想说的是,峰值有很多计数,因此我正在寻找一种可以针对高流量进行缩放的解决方案。处理无限大的计数器是一个非常不同的问题,但我猜您可以得出一个合理的界限,并使用适当的64位长的数据类型?。我不知道如何在MySQL中处理真正的无界数字。我建议尝试将这个设计问题分解为单独的问题。