Java 如何在基于MySQL的应用程序中有效地在用户上存储多个不同的计数器值?
我想为我的用户存储不同种类的计数器。 平台: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中,并拥有一个聚合后台线程,而不使用其他技术 总而言之,我关注的是: 减少行锁定 有准确的交易记录吗?Java 如何在基于MySQL的应用程序中有效地在用户上存储多个不同的计数器值?,java,mysql,Java,Mysql,我想为我的用户存储不同种类的计数器。 平台:Java 例如,我已确定: 当前数字记录 当前步数 currentNumFlowsInterval1440 currentNumFlowsInterval720 currentNumFlowsInterval240 currentNumFlowsInterval60 currentNumFlowsInterval30 等 上述每个计数器需要在每个月初为每个用户重置。每个计数器的值可能会高到无法预测的峰值等。我的意思是,很多事情都会被计算在内,所以我想考
谢谢你的想法:你说的话有点矛盾 每个用户的计数数量可能很大,或者至少不可预测 对我来说,这意味着它们必须是一致的,就像一个数组。不可能有无限数量的异构数据,除非您有无限数量的代码和无限数量的开发人员时间 如果它们是统一的,则应将它们展平为一个表user\u counter,其中每一行的格式为user\u id、counter\u name、counter\u value。但是,您需要仔细考虑需要什么类型的索引,等等。如果它们都设置为零或某个默认值是一个SQL查询,则在月初进行更新
基本上是c。a和b是最荒谬的,MySQL仍然是一种合适的技术。您的需求并不是那么不典型。一般来说,这是统计会话/用户/。。。绑定的书面数据 第一件事是,如果还没有这样做的话,就把事情分开。建立一个只读数据库,并分别收集这些数据。因此,为正常属性创建一个单独的用户表
统计数据可以保存在内存表中。您还可以使用数据库、消息队列、会话属性以外的其他方法。我试图澄清我的问题。柜台是统一的。我只是想说,计数器值可能会高得无法预测。我想说的是,峰值有很多计数,因此我正在寻找一种可以针对高流量进行缩放的解决方案。处理无限大的计数器是一个非常不同的问题,但我猜您可以得出一个合理的界限,并使用适当的64位长的数据类型?。我不知道如何在MySQL中处理真正的无界数字。我建议尝试将这个设计问题分解为单独的问题。