秒杀相关的问题
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 分布式事务
本文来自博客园,作者:长寿奉孝,转载请注明原文链接:https://www.cnblogs.com/tyt0o0/p/17812569.html