秒杀设计

  ---- 个人设计,未经实践,欢迎指正。

场景
预估请求量:1kw,商品:gbjd,库存:50。

server数量:10。
server实现(queryCount + stock in redis)
1:限流
limit
初始为5-10,limit大时,尽量在有人取消时,第一次进来其他用户能秒杀到。

一次处理后,当库存减为0时,可将limit减为1,如果有人取消订单,再来的请求可进来处理。


queryCount
AtomicInteger/Semaphore,记录当前正在处理的请求量,当queryCount等于limit时,再来的请求直接拒绝。

2:库存
redis中记录stock = 50,当请求通过限流后,如果stock <= 0,则秒杀失败。
如果stock > 0,则执行decr stock,当返回值 >= 0 时,去myslq减库存。
update product set stock = stock - 1 where sku = 'gbjd';
(因已通过redis decr,mysql不用再判断old stock)。
当返回值 < 0 时,执行incr stock还原库存,并返回秒杀失败。

3:取消订单
取消订单,mysql stock + 1,redis中incr stock。
通过限流的用户,通过redis decr stock后,下单去mysql减库存。

4:失败

减库存时,如果mysql减库存失败,重试后,仍失败,redis incr stock,秒杀失败。

原文地址:https://www.cnblogs.com/vsop/p/12055954.html