huanzui / miaosha

Java高并发秒杀系统

Home Page:http://miaosha.adxiang.top/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Java高并发秒杀系统

项目预览地址:http://miaosha.adxiang.top/

成果展示

初始情况

初始项目情况

后端:SpringBoot,MyBatis

前端:Thymeleaf,Bootstrap,Jquery

中间件:Druid,Redis,RabbitMQ

服务器情况

服务器类型:阿里云轻量应用服务器

CPU核心数:单核

内存:2G

磁盘:40G

初始QPS

用一段代码往数据库里插入了1500条用户信息,并生成相应的用户Token,保存在tokens.txt中

使用JMeter来进行压力测试,由于我的阿里云服务器配置较低,压测的时候出现很多问题,而且不能测试太多线程

所以,我就改用我的的Windows电脑进行测试,采用的也是本地MySQL和本地Redis

QPS:是指每秒内查询次数,比如执行了select操作,相应的qps会增加。QPS = 总请求数 / ( 进程总数 * 请求时间 )

  • 压测商品列表

1500个线程*10次,平均QPS = 1076/sec

  • 压测秒杀接口

自定义变量模拟多用户

1500个线程*10次,平均QPS = 652/sec

开始优化

并发的瓶颈在数据库,如何减少对数据库的访问呢?最有效的办法就是加缓存

页面优化

  • 页面缓存 + 对象缓存

  • 页面静态化,前后端分离

  • 静态资源优化(未实现)

  • CDN优化(未实现)

解决超卖

  • 数据库加唯一索引:防止用户重复购买

  • SQL加库存数量判断:防止库存变成负数

接口优化

  • Redis预减库存减少数据库访问

  • 内存标记减少Redis访问

  • RabbitMQ队列缓冲,异步下单,增强用户体验

安全优化

  • 秒杀接口地址隐藏

  • 数学公式验证码

  • 接口防刷

其他项目亮点

  • 使用Redis实现分布式Session

  • 明文密码两次MD5

优化后压测

下面的压测都是在安全优化之前进行的

  • 压测商品列表

1500个线程*10次,平均QPS = 2315/sec

优化后QPS提高为原来的2倍,但仍然有一些不足

由于我将商品列表的HTML页面缓存到Redis,并设置了有效期为60秒,也就是说,60秒之内该页面的商品数量是不会发生改变的

  • 压测秒杀接口

自定义变量模拟多用户

1500个线程*10次,平均QPS = 1696/sec

优化后QPS提高为原来的2.6倍

遇到的问题

在后期优化的时候,存在RabbitMQ接收不到的情况,后来发现是我本地程序和服务器部署的程序使用了同样的对列名,也就是在这个生产消费者模式中,存在两个消费者。则就会在我本地产生一次接的到,一次接不到的问题

About

Java高并发秒杀系统

http://miaosha.adxiang.top/


Languages

Language:Java 80.8%Language:HTML 18.1%Language:JavaScript 1.1%