秒杀相关的问题

1、高并发场景,要避免请求操作数据库。用定时任务将数据定时更新到Redis中,请求直接查询Redis。

2、更新秒杀商品的库存时,可以通过where 库存 > 0来做一个乐观锁的效果。

  MySQL 的InnoDB引擎 在更新行的时候会加行锁。

update seckill_product set stock_count = stock_count - 1 where id = 13 and stock_count > 0

 3、在控制层面,将多余的请求拦在外面。

  将商品库存信息放入Redis,进入接口将Redis中库存递减,成0的直接拦住,不让操作数据库。

4、防止重复下单,可以通过Redis的Set数据结构判断。

  用户抢购完成,把订单信息放Set。

5、给数据库表字段加唯一约束,防止重复购买。

6、在上面第三点,一个商品秒杀的时候,将多余请求拦住,但是同时存在多个商品秒杀活动时,每个商品放行十几个请求,同时请求数据库依然很大。

  使用MQ对秒杀请求做异步处理。

  如此操作后,服务器通知用户下单成功,需要用到websocket。

7、websocket如何解决连接太多的问题:

把连接放在多个服务中,发信息通过MQ发广播,那个服务找得到连接就那个服务发。

8、如何解决长期不用的连接一直不断。

定期发送心跳包

 9、

秒杀->

controller查redis拦掉大部分请求->

消息队列异步->

秒杀,库存减少,生成订单,延时队列->

没有支付,订单取消,库存加一 ,更新redis ->

成功失败都发队列->

websocket通知成功失败->

秒杀失败了更新redis,避免拦请求了,导致卖不出去。 

10、利用MQ实现分布式事务   最终一致性

 

11、Seata 分布式事务

 

posted @ 2023-11-06 17:00  长寿奉孝  阅读(20)  评论(0编辑  收藏  举报