请教一个Java高并发的设计问题与我目前的解决方法

新手上路,请多包涵

环境:SpringBoot 2.x, JDK 1.8, MySQL 8.0.15

需求

做一个类似发卡平台的api,每次访问从数据库获取一条数据,要保证这条数据只能被获取一次
目前测试约为每30秒60次的访问,接下来的测试同样的时间访问量会成倍增加

我的解决方法

数据库中设计一个字段,保存这条数据的使用状态。写了一个存储过程,大致流程是这样:先开始事务,再获取需要的数据同时上行锁,再修改这条数据的使用状态,最后返回数据,提交事务。
这样查询语句中需要加数据是否使用过的条件。

我想来想去,总觉得这不是最好的解决方案,小白技术有限,经验不足,想请大牛赐教,谢谢!

阅读 1.8k
2 个回答

不敢赐教,一起探讨一下.

发卡平台有两个步骤,一个是分配,一个是标记.我建议分配这个步骤不用在数据库做吧?这样会很麻烦而且不好管理.

可以使用程序每次load 10000(数据待定,和业务俩有关)条数据的主键到内存里,然后在程序中加锁进行分配,分配结束之后错峰写入数据库.和加一层缓存是一个道理.

当内存中剩余数量低于某个限制值的时候再去load,这样做性能应该会好很多.

参考分布式ID的生成策略。同样是一个ID只能使用一次,不能重复。

先生成在写入应该会简单点。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题