kayw-geek / seckill-redis

PHP秒杀场景解决方案

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

模拟商城秒杀场景防止高并发下多下单问题

一共做了俩种解决方案:

  1. Mysql事务解决高并发多下单问题
  2. Redis队列解决高并发多下单问题

Mysql事务思路:

使用php异常处理和mysql事务,将数据库操作的的代码都写在事务里,出现异常就到catch中做rollBack。

只有订单写入成功了 库存减1成功了才执行commit

其中那一步骤出现问题都rollBack

Redis队列思路:

​ 其实就是写入订单信息 和减少库存信息不操作mysql,而操作redis.然后把用户抢购信息写进redis中,之后根据redis中的抢购信息,在写进数据库。

  1. 根据库存数量 push进对应数量的链表 eg://有100个库存就写将链表长度添加到100

  2. 每有一个抢购请求就从链表中pop一次

  3. 将用户的用户的下单信息写进redis中储存

  4. 最后根据redis中的下单信息一次性写进mysql中,写进一条订单信息就减相对数量的库存,在删除redis中的用户下单信息

    第4步 抢购期间由计划任务每秒执行一次(每秒坚持队列中是否有新用户抢购成功,写入订单表,方便用户抢购后查询)

以上俩种都经过压力测试,数据库没出现任何问题。

测试工具webbench

About

PHP秒杀场景解决方案


Languages

Language:PHP 96.3%Language:HTML 3.1%Language:Vue 0.6%