秒杀模块:
秒杀特性
就比如12306 抢票—>秒杀行为
1.2 秒杀通用
并发流量:QPS(每秒的查询请求数量)
库存的命中率低
静态:商品信息
动态数据:库存+时间
1.3 数据库设计
秒杀商品和普通商品是分离的
1.秒杀商品表
商品价格
秒杀价格
库存量
2.订单表
商品
用户
时间
3.订单详情表
订单中的商品的详情秒杀
4.商品表
商品信息
5.用户表
用户信息
业务逻辑:
// 1.验证购买上限
//2.查询数据库的信息,查看该商品是否存在
//3.进行秒杀时间的比较
//如果开始时间小于当前时间 说明活动还未开始
//如果结束时间小于当前时间 说明活动已经结束了
//为了防止用户重复下单 所以查询用户是否下过订单
//查看库存是否存在
//生成订单
//订单生成成功
//进行减库
秒杀的共性问题:
秒杀减库存
1、下单立减
用户下单成功,立即减库存
第一版 可以作为测试版
2、付款立减
付款成功,更改库存
可以预防恶意刷单
3、预减库存
基于Redis
下单–>更改Redis库存–>付款—>更改数据库的库存
秒杀的超卖
Java锁的实现
ReentrantLock、synchronized
Mysql排他锁 在修改库存的时候,加个验证 库存量>0
乐观锁
基于Version 。结合CAS的思想去实现 安全控制 基于Redis命令
Redis命令执行的时候,单线程的
秒杀接口的隐藏
为了安全起见,一般需要把秒杀杀接口,隐藏起来,防止外部 用户提前发现秒杀接口,进而进行违规操作 一定的加密规则 URL动态化
恶意下单
黑名单处理 限定购买的数量
用户+IP 进行限制 异常的请求 加入黑名单
差评师
舆情系统
限流
对于高并发的请求,一般都要求做限流
1.限流算法 1.令牌桶 2.漏桶
2.Api限流 第三方技术 3.软件
Tomcat/Nginx
可以设置大的并发连接数量和连接的等待时间