10万并发优惠券玩法

581 阅读1分钟

单优惠券

优惠券做法相比订单简单很多,用 list 结构,每次 pop,返回值不为 null 就说明成功抢到,反之说明没抢到。
coupon_process.png
事务范围有必要说一下,如果请求没有顺利的走完步骤2,应该返回异常给用户,同时定义事务回滚方法,在回滚方法里面返回 redis 库存呢。如果你看过我的高并发下单加锁吗?,你可能会疑惑为什么这里没有考虑 redis 宕机 和 jvm 宕机。

肯定需要考虑,只是没画出来(偷懒了)

1、redis 宕机,花点钱保证 redis 高可用吧
2、jvm 宕机事务会回滚,无法确定优惠券所扣库存 x。定义一个定时任务,具体做法参考高并发下单加锁吗?。同时特别要注意,这一步属于重建缓存,需要加锁避免缓存击穿
3、关于消息丢失,我是觉得优惠券流水新增个状态或者新增字段,代表该库存扣减是否落库到 db,这样就不用特地为此特意建表

组合优惠券

组合优惠券是把好几种优惠券一起打包发给用户,这里可以创建一个组合优惠券的的 list,剩余的步骤与上图别无二致。

总结

1、list pop 适合固定量的玩法,比如秒杀,优惠券,都是限定每次只能秒/领固定数量
2、还有种玩法,如果你的优惠券并发很高,可能有几百万,几千万,但 redis 是单机,流这么大的流量,肯定得拦住。可以把请求丢到 mq,玩一个削峰,但有个前提,你的接口及时性要求不高,ummmmmm