关于并发、超卖处理的思路

做电商网站,经常会有各种秒杀和热门商品,所以高并发的处理一直是电商最重要的事情。这里记录下当初自己是如何处理的

写在前面:

1、本文设计到的并发处理均是针对纵向,不针对横向扩展,即只设计从PHP层面到数据库层面的处理,不涉及多台服务器,集群、大带宽等的横向设计。

2、本文中涉及到的高并发并不是淘宝京东等几百万几千万等的高并发,仅仅只是普通最多上万的并发处理

3、本文不对悲观锁乐观锁做设计

问题:

普通电商中的秒杀中的并发问题,超卖问题

实例:商品数量为100,秒杀人数为10000,整点开始秒杀

秒杀大概流程:

①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付

解决思路:

1、人数阀门设计

2、会员排队设计

3、问答问题设计

4、库存缓存设计

5、页面静态设计

思路理解:

一、人数阀门设计:进行用户人群过滤。

商品数量只有100份,秒杀人数有10000人,那么我们就设计1道阀门(根据情况,可以设计3道或者2道都可以的)。

在整点的时候,我们对点击了“购买”按钮后,我们只运行500人进入信息填写页面,信息填写完成后提交订单。效果如下:

①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付

               10000人                          500人                    (这里也可以设计阀门,只允许多少人进入支付)

其他未进入的如何处理乃?显示已抢完或者排队等待(这就是后面要提到的排队系统设计)

二、会员排队设计:对用户进行排队,排在前面的先购买

这相当于是消息队列模式了,如果秒杀是立即知道结果,排队可能会有点鸡肋。

在第二步②输入信息提交订单后进行排队,排在前面的先购买,排在后面的后购买

三、问答问题设计:过滤掉一些反应慢的用户

在第一步①点击购买后跳转到问题页面,用户必须回答正确问题后,方可进入后面的流程

四、库存缓存设计:缓存库存,判断用户购买的商品是否还有,不读取数据库,速度快,也不会增加数据库负担,经过前面的过滤,超卖的可能性比较低了

提前将商品库存缓存起来,到下单购买的时候,用户购买了就减1,每次都通过库存缓存判断一下,如果为0就显示已抢完。

五、页面静态设计:尽量静态缓存化【CDN那些这里不做考虑】

第一步①商品详情页面,尽量进行缓存,减轻大批量用户在访问商品页面的时候,大量查询数据库。

问答问题页面:全静态,加载快,无数据库负担。

排队等待页面:全静态,加载快,无数据库负担。

排队结束页面:全静态,加载快,无数据库负担。

小试牛刀:

上面说了那么多废话,总归在一起,流程大概就成了下面这样:

①商品详情点击购买(秒杀)  --》 ②进入问题回答页面      --》③排队等待 --》 ④输入信息提交订单    --》  ⑤进行支付

    页面缓存                                        问题过滤                      阀门过滤                                       缓存库存减少

                                                          页面缓存                      页面缓存

 

 

附件:

一、参考资料

①、淘宝阀门设计

②、各大电商网站秒杀流程

③、网络上面的各种文献资料

 

 

### 回答1: 对于高并发场景下的商品秒杀,我的设计思路是采用分布式架构,将请求分散到多个服务器上进行处理,同时使用缓存技术和消息队列来提高系统的性能和可靠性。具体来说,可以采用以下措施: 1. 使用缓存技术:将商品信息、用户信息等常用数据缓存在内存中,减少数据库的访问次数,提高系统的响应速度。 2. 使用消息队列:将用户的请求放入消息队列中,异步处理,避免请求堆积,提高系统的并发能力。 3. 限流措施:设置访问频率限制,防止恶意攻击和过度消耗系统资源。 4. 数据库优化:使用数据库连接池、索引等技术来提高数据库的性能和并发能力。 5. 分布式架构:将请求分散到多个服务器上进行处理,避免单点故障和系统崩溃。 通过以上措施的综合应用,可以有效地提高系统的性能和可靠性,实现高并发场景下的商品秒杀。 ### 回答2: 在高并发场景下实现商品秒杀需要考虑几个方面的设计思路。 首先,为了提高系统的并发能力,可以通过分布式架构来设计。将商品库存等信息分散到多台服务器上,通过负载均衡来均衡并发访问请求,减轻单个服务器的压力。 其次,为了防止超卖问题,可以使用分布式锁来保护商品库存的减少操作。当一个用户发起抢购请求时,先获取锁进行商品数量减少的操作,在减少成功后再进行下一步操作,否则释放锁。这样可以保证只有一个用户可以成功购买商品。 另外,为了提高系统的响应速度,可以使用缓存来减少数据库的压力。将商品信息或者库存信息缓存在内存中,用户访问时直接读取缓存中的数据,而不是直接访问数据库。当商品抢购成功后,再对缓存中的数据进行更新。 此外,为了防止恶意请求,可以使用验证码来进行人机验证。在用户参与秒杀之前,先输入验证码进行验证,只有验证通过后才能参与秒杀活动。 最后,可以通过限制每个用户的参与次数来平衡系统压力。例如,设置每个用户只能参与一次秒杀活动,这样可以避免少数用户通过机器人等方式进行大量请求,从而导致系统崩溃。 综上所述,高并发场景下实现商品秒杀需要通过分布式架构、分布式锁、缓存、验证码和限制参与次数等多种设计思路来提高系统的并发能力、保证数据一致性、提高响应速度,并防止恶意请求。 ### 回答3: 在高并发场景下实现商品秒杀,主要需要考虑以下几个方面的设计思路: 1. 分布式系统架构:为了应对高并发的请求,需要使用分布式系统架构,将请求分散到不同的服务器节点上进行处理。可以采用主从架构或集群架构来实现。 2. 缓存优化:为了提高系统的响应速度,在秒杀开始前将商品信息加载到缓存中,并使用缓存技术如Redis等进行商品库存管理。当用户请求秒杀时,先从缓存中读取商品信息,减轻数据库的压力,并且可以设置缓存的过期时间,避免商品库存信息不一致的问题。 3. 队列消息机制:秒杀场景涉及到同时并发大量的请求,使用队列消息机制可以缓解高并发带来的压力。当用户下单时,将用户请求放入消息队列中,再由消息队列异步地处理用户的秒杀请求。 4. 限流措施:为了避免系统过载导致崩溃,需要对用户请求进行限流处理。可以使用令牌桶算法或漏桶算法来控制系统的请求处理速率,以保证系统的可用性。 5. 数据库优化:秒杀涉及到大量的数据库操作,针对这一情况可以进行数据库的优化。例如,可以使用数据库连接池来提高数据库连接的效率,同时对数据库进行垂直切分或水平分片等策略,使得数据库能够承载更高的并发请求。 总之,在高并发场景下实现商品秒杀需要从系统架构、缓存优化、消息队列、限流措施和数据库优化等多个方面进行综合考虑,以提高系统的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值