---- 我的设计,未经实践,欢迎指正。mysql
场景
预估请求量:1kw,商品:gbjd,库存:50。redis
server数量:10。
server实现(queryCount + stock in redis)
1:限流
limit
初始为5-10,limit大时,尽可能在有人取消时,第一次进来其余用户能秒杀到。sql
一次处理后,当库存减为0时,可将limit减为1,若是有人取消订单,再来的请求可进来处理。设计
queryCount
AtomicInteger/Semaphore,记录当前正在处理的请求量,当queryCount等于limit时,再来的请求直接拒绝。server
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还原库存,并返回秒杀失败。it
3:取消订单
取消订单,mysql stock + 1,redis中incr stock。
经过限流的用户,经过redis decr stock后,下单去mysql减库存。date
4:失败map
减库存时,若是mysql减库存失败,重试后,仍失败,redis incr stock,秒杀失败。请求