秒杀系统设计策略
2025-09-25 14:50:30 0 举报
秒杀的详细流程以及设计策略方案
作者其他创作
大纲/内容
负载均衡 限流熔断 SSL卸载
Redis集群库存预热 分布式锁
详细步骤:一、准备阶段: 1.提前将秒杀商品库存加载到Redis中,使用一个key来存储库存数量。 2.设置一个标志位,表示秒杀是否开始。二、秒杀过程: 1.用户点击秒杀按钮,前端发送请求到后端。 2.后端首先检查秒杀是否开始,如果未开始则返回错误。 3.检查用户是否已经秒杀过(通过Redis记录用户ID和商品ID),如果已经秒杀过则返回错误。 4.检查库存,如果库存不足则返回错误。 5.如果以上检查都通过,则扣减库存(使用Redis的DECR命令),并记录用户购买记录(设置一个过期时间,避免记录永久保存)。 6.扣减库存成功后,生成一个订单号,将订单信息发送到消息队列。 7.后端立即返回前端“秒杀成功”,但此时订单并未真正生成,只是进入了队列。 8.前端收到响应后,跳转到等待页面,等待订单处理结果。三、异步下单: 1.消息队列的消费者从队列中取出订单信息。 2.消费者处理订单:检查库存(二次检查,防止意外)、检查用户是否重复购买(二次检查)、创建订单、更新数据库等。 3.处理完成后,将订单结果存储到缓存中,前端可以通过轮询或长连接来获取订单状态。四、其他策略: 1.库存预热:提前将库存加载到Redis。 2.随机过期时间:对于缓存中的key,设置随机的过期时间,避免缓存同时失效。 3.熔断机制:如果下游服务(如数据库)压力过大,及时熔断,避免雪崩。 4.限流:在网关层和服务层都要进行限流,防止系统被冲垮。五、数据库设计: 1.商品表:商品ID,商品名称,库存等。 2.订单表:订单ID,用户ID,商品ID,订单状态,创建时间等。六、超卖问题解决: 使用Redis的原子操作扣减库存,确保库存扣减的原子性。同时,在数据库层面也可以使用乐观锁(版本号)来防止超卖,但主要依靠Redis的原子操作。七、恶意请求防范: 1.用户必须登录才能参与秒杀。 2.对同一用户多次请求进行限制(前端按钮禁用,后端使用Redis记录用户购买记录)。 3.对同一IP的请求频率进行限制。八、系统稳定性: 1.压力测试:提前进行压力测试,了解系统瓶颈。 2.监控:对系统各项指标进行监控,如QPS、库存、订单量等。九、容错处理: 1.如果Redis宕机,可以考虑降级到数据库,但性能会下降,所以需要保证Redis的高可用(主从、哨兵或集群)。 2.如果数据库压力过大,可以采取限流、降级等措施。
消息队列
网关层 风控检测请求过滤
缓存层
前端层
数据层
静态资源CDN按钮防重复 倒计时同步
接入层
数据库集群分库分表 最终一致性
服务层
Kafka/RocketMQ削峰填谷异步处理
0 条评论
下一页