2 qq 20473793 qq_20473793 于 2016.02.29 09:17 提问

并发下单的优化,如何优化insert操作? 2C

现在有一个web下单的系统,可能会有上万的用户同时下单,而且不用考虑库存是不是
足够的问题,主要的问题是上万次的insert操作会进行上万次的insert,请问可不可以进
行优化,让insert操作可以一部分的commit。然后还要能够保证客户下单以后能够立即
看到订单的信息?
1.现在已经使用了ehcache。我的打算是先把订单信息插入到ehcache,然后直接返回
,接着把订单信息放入blockingqueue,跟数据库进行同步。这样用户可以立马查询到
缓存的信息,至于数据库的同步,是他不用关心的了。

请问这样可行吗?或者是有更好的办法?

3个回答

xiongzirui
xiongzirui   2016.02.29 10:50

可以批量插入啊,一次插入一千条之类的

xiongzirui
xiongzirui 这么大数据量实时insert到数据库肯定是有问题的,可以采用redis存储,然后约定多久同步一次到数据库,也不用担心数据因为重启等原因丢失
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you 每个用户就是一个请求,是多线程并发处理的,不可能收集到一起进行批量插入的。
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.29 10:57

上万用户同时下单,这是并发执行的,各自的请求处理各自的插入操作,建议优化下单业务逻辑,提高代码效率,减少响应时间。如果是一个用户同时产生多条订单记录,可以用批量插入。

qq_20473793
qq_20473793 对,确实有顾虑到这样的问题,并发很难或者不可能把不相关的订单信息合到一起去处理的,他们的事务应该都是独立的,看来只能够增加服务器,提高业务逻辑的效率了?
接近 2 年之前 回复
broust
broust   2016.03.01 13:35

不考虑一致性,或则业务上允许ehcache成功,但是最终落库失败的情况。可以这么搞。
如果业务上需要强一致性(告知用户成功,必须成功),可以考虑如下方案:
用户请求进来-->
拿令牌------>拿到令牌--->对blockingQueue拿等待操作的任务---->并发插入------>唤醒任务等待线程---->归还令牌
| |
---->没拿到令牌--->将任务放到blockingQueue--->当前线程等待---------->被唤醒-->返回结果

使用这个方案,等待任务需要设置一个超时时间,如果在blockingQueue等待时间过长,则等待线程直接返回。然后对应的等待任务被拿出来执行的时候,直接忽略.

这样的逻辑,可以直接放在持久化层,对外层的业务不影响。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!