①添加一个事务,通过事务来进行表的锁止,更新完库存后再释放锁。(在一般请求量不是特别巨大的都可使用)
②新增表数据一个标识字段,通过此数据变动来进行。(或者直接取用已售字段值进行校验)
- 首先用户进入秒杀接口,最先执行查库存方法。如果库存量和已售量相等则直接结束,否则执行下一步,接着进行对查询的库存量返回的库存信息进行直接条件更新,即此时在此条库存数据的条件字段进行数据更新。用于下一步用户携带此变动记录进行比对。
- 首先判断标识是否是我们查询库存时候的标识,如果是,直接扣减库存和改动标识内容,成功抢购,并在订单表创建一个订单。如果发现标识变了,则不更新数据库,直接返回抢购失败
③接口限流:令牌桶限流算法(限制瞬时大量请求访问)
使用Guava的RateLimiter实现令牌桶限流接口。参考实现的具体
④抢购接口隐藏(接口加盐,防止脚本刷接口)
-
每次点击秒杀按钮,先从服务器获取一个秒杀验证值(接口内判断是否到秒杀时间)。再此阶段可对用户的个人信息和商品信息进行合法性校验,也可以对当前时间和秒杀时间也进行校验。
-
Redis以缓存用户ID,商品ID,标识符和盐为Key,自定义唯一Value作为缓存验证值。
-
用户请求秒杀商品的时候,要带上秒杀value验证值进行校验。用户多次点击更新对应redis的校验值。为防止用户恶意请求获取验证值的接口,可同时设置用户请求时redis新增请求次数,在达到阈值之后直接返回频繁操作提示。
⑤单用户限制频率(限制某个用户频繁请求)
- 真实ip地址限制(不建议使用,存在当前同一ip下多个正常用户使用会受影响)
- 前端对在设定秒数内多次点击进行拦截不发送请求。
- 后端有两种思路的限频,第一种是用户请求在redis新增一个当前用户请求下单接口的记录,并给该记录设置一个过期时间。第二种同样是在redis新增一条记录,但是该记录记录的值为用户访问的次数,每调用一次进行加一 ,在到达阈值之后进行限制。