1

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

例如,我已经确定:

  • currentNumRecords
  • currentNumSteps
  • currentNumFlowsInterval1440
  • currentNumFlowsInterval720
  • currentNumFlowsInterval240
  • currentNumFlowsInterval60
  • currentNumFlowsInterval30
  • 等等

上面的每个计数器都需要在每个月初为每个用户重置。每个计数器的值可能会出现无法预测的高峰值等。(我的意思是很多东西都被计算在内,所以我想考虑一个可扩展的解决方案)。

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

a)我是否应该为用户表上的每个计数器设置单独的列并执行“更新设置 counterColumn = counterColumn+ 1”之类的操作?

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

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

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

d)在 MySQL 中做所有事情还是使用其他技术?我还考虑过使用另一种解决方案来存储计数器并仅将聚合保存在 MySQL 中。例如,我已经尝试过使用 Apache Cassandra 的分布式计数器。我担心的是 cassandra 没有的交易。我需要准确的计数器,因为它们用于计费,因此我不知道 Cassandra 是否适合这里,尽管 Cassandra 的可扩展性似乎很诱人。Redis 用于存储计数器 + 在 MySQL 中写入聚合呢?Redis 有什么东西可以帮助我吗?或者我应该将所有内容存储在内存中的简单 Java HashMap 中并拥有一个聚合后台线程并且不使用其他技术?

总而言之,我担心:

  • 减少行锁定
  • 有确切的计数器(交易?)

谢谢你的想法:)

4

2 回答 2

0

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

如果还没有这样做,第一件事就是拆分。制作一个主要是只读的数据库,并分别收集这些数据。因此,为普通属性创建了一个单独的用户表。

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

于 2012-11-26T20:52:40.237 回答
0

你说的有点自相矛盾。

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

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

如果它们是统一的,则应将它们展平为表 user_counter ,其中每一行的形式为(user_id, counter_name, counter_value)。但是,您需要仔细考虑需要什么样的索引等。如果它们都设置为零或某个默认值,则在月初更新是一个 SQL 查询。

基本上(c)。(a) 和 (b) 是最荒谬的,而 MySQL 仍然是适合此的技术。

于 2012-11-26T19:35:09.303 回答