前言
高并发的秒杀活动中,通过查询数据库判断是否还有库存,然后对库存字段进行增减,极易出现库存超出或者库存为负的情况,一般来说有3中解决办法(数据库表加锁,memche缓存,redis队列);
我们这里使用redis来解决问题
1、思路:
1)触发开始开团的同时,把库存数量更新到id对应的队列上去(定时更新,或者手动更新)
2)用户请求接口,如果队列长度>0,移除一个队列记录,同时对数据库进行相应操作
3)如果队列长度<=0,拦截用户的访问,返回‘无库存’
2、重点设计在数据库层面
2张表:
第一张:判重表(buy_record),该用户有没秒杀过该商品
字段: id, uid, goods_id, addtime
第二张表:商品表 goods
字段:goods_id goods_num
方案一
方案二
方案三
该方法完美的解决了超卖与select排它锁导致的并发低的问题,并且4个sql缩减成2个sql语句。极大提升性能。