我想为我的用户存储不同类型的计数器。平台: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 中并拥有一个聚合后台线程并且不使用其他技术?
总而言之,我担心:
- 减少行锁定
- 有确切的计数器(交易?)
谢谢你的想法:)