V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ky1inZhang
V2EX  ›  程序员

#求助 |  Java 并发编程 | 数据结构 | 请各位指点一二

  •  
  •   Ky1inZhang · 2019-12-02 14:49:09 +08:00 · 1244 次点击
    这是一个创建于 1802 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情提要。

    本人搬砖阶段菜鸟一只,打算私下写个小程序,好吧仅仅只是打算。用我能会的捋一遍先。

    小程序粗略计算十个页面够了,查查 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 条回复    2019-12-02 23:42:51 +08:00
    crclz
        1
    crclz  
       2019-12-02 23:42:51 +08:00
    应用程序状态应该放在数据库里面,而不是应用程序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:36 · PVG 05:36 · LAX 13:36 · JFK 16:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.