前情提要。
本人搬砖阶段菜鸟一只,打算私下写个小程序,好吧仅仅只是打算。用我能会的捋一遍先。
小程序粗略计算十个页面够了,查查 UI 框架用原生写。后台接口用 spring boot,然后 mybatis,mysql 一套,虽然感觉 mysql 也挺沉的,我只有薅羊毛的谷歌云。
已知:我有四个值,两个单位人和次。
A 人,(10 ~ 100)* A 次,
B 人,(10 ~ 100)* B 次,
* 预期是 A≤B,但数据初期四个值不可预期。
A 人的 1 次和 B 人的 1 次存在抵消或者兑换关系。
上面说的可能有些复杂,我觉得像是抢车票或者秒杀。但是又太笼统了。我这也不是搞秒杀,只是考虑一定会有并发,或者说主要是分配问题。
两个问题==+*+==## | 下面三段我精分了
1.抢车票用多程模拟的话就是锁住票。 然后我上面的需求,不是多个人抢票,而是多个人抢多个人的票,多了对应关系,人的次数要拆分抵消掉。不是为了抢而抢,而为了节省资源,抢占的分配。想到这里我就不会了,感觉是要往分段和队列方向靠。思维上有点不明朗。想都想不通别说写了。
简单来说就是 20×30 抵消掉 30×20,怎么不浪费资源不阻塞且效率的运行,这四个数字还是在动态变化的。
这段我想想又变了,好像用 ConcurrentLinkedQueue 就可以? 虽然我想象的是两方面对冲,但实际上我只能保证单方面出来的结果,对结果排序,实际的执行还是整体看做抢票行为,我想要剥离出来的人向量被忽略掉了。
2.数据的存储形式,每次的变化肯定是 1 次。
1).我本来打算用拉链表记录变化值 1,然后 sum 出某天的值,这样还可以出历史记录,但这样总的次数就要全表 sum 了,不科学,所以我想再出一张表存当天的结果。
2).如果不用拉链表记录 1 次的变化值,那么操作修改一个人的次数值字段,就要不停的访问数据库,感觉会冲突或者锁住,也很浪费资源。能不能程序里处理好然后分段提交到数据库,这就又回到开始的并发问题了。
总结一下问题,Java 的并发,Java 和数据库的数据结构。 希望各位大佬能指示一下方向或提点一些关键字。
1
crclz 2019-12-02 23:42:51 +08:00
应用程序状态应该放在数据库里面,而不是应用程序。
|