秒杀优化的解决方案By和奇科技

作者:和奇一号发表于:2019-05-10

1.解决同一个人重复购买此商品的问题:
    解决方案:用户下单后,向redis中存放一个预支付信息。当进入到下单的方法时,先判断redis中是否存在该用户的预支付信息。
        如果存在,则抛出异常提醒先去支付已买商品。

service层:

图片.png


2.解决超卖的问题
    超卖是由于redis和mysql处理能力不同造成的。
    因为用户从redis中获取商品信息时,redis处理能力是很强劲的。而用户抢到商品下订单后,订单保存到mysql数据库,数据库本来
    处理能力是没有redis强劲的。所以,可能造成同时5个用户,能够为同一件商品下订单,这是不允许的。
    
    可以使用redis队列解决。
    使用list存储形式。可以基于左右压栈操作。
    
    基于redis队列,缓存某个秒杀商品还剩多个库存。
    
    
    
    消息队列也可以实现。

在这我们通过redis的左压栈实现


图片.png



3.使用多线程解决操作mysql的问题
    因为mysql执行效率比redis要低,所以,需要充分利用CPU的资源,提升mysql处理操作
    可以基于spring整合多线程完成该操作。在spring配置文件中配置线程池。

配置线程池:

图片.png


我们将执行数据库操作出去到线程中去


图片.png


4.排队人数提醒
    当一个请求进入下单的方法时,需要设置排队人数加1,当排队人多大于库存一定值时(例如10,根据业务规则确定),抛出异常,提醒排队人数过多。
    当一个人下单买完商品后,排队人数减一(在多线程下单模块完成)


图片.png