Java高并发秒杀项目

Java高并发秒杀项目

项目代码见github,欢迎issue、fork、star。

项目实现

项目运行环境:Win10+Ubuntu18.04虚拟机,JDK1.8

项目中使用了关系型数据库MySQL(5.7.29)和非关系型数据库Redis(4.0.2),中间件RabbitMQ,因此在运行前需要将他们安装好,这三个都安装在Ubuntu系统中。

Mysql安装步骤

数据库表生成见github中的sql生成文件

Redis安装步骤

RabbitMQ安装步骤

安装好之后填写配置文件miaosh/src/main/resources/application.properties中的连接信息(主机地址和用户名密码等)

填写好之后运行miaosh/src/main/java/com/imooc/miaosha/MainApplication.java文件即可

项目介绍

基于Springboot+Mybatis搭建的电商秒杀系统,对高并发场景进行了优化,在保证线程安全的同时也提高了对系统的并发访问量。主要优化手段有Redis缓存(页面缓存,对象缓存)、页面静态化、RabbitMQ异步下单。项目的主要功能流程为登录-->浏览商品-->查看商品详情-->下订单-->付款或返回。本系统使用jmeter工具进行压测,对比优化之前和优化之后系统提高的并发访问量。

系统设计

1.登录功能

用户使用手机号和密码进行登录并实现了分布式session。密码使用两次md5+salt(盐化),第一次是前端使用固定salt值结合password进行一次MD5传到后台,是为了防止明文密码在网络中传输被窃取。数据传到后台之后用手机号验证用户是否存在,如果存在返回数据库中的salt,与前端传来的password(经过一次MD5)结合再次MD5,然后进行比较。密码相同则生成token,将token作为key,用户信息作为value存储到redis缓存中,同时将token返回到浏览器中缓存,以此来实现登录功能中的分布式session。

2.商品展示功能

这里并没有复杂的业务逻辑,单纯的三个展示页面,商品列表页,商品详情页,订单详情页。

3.秒杀功能

秒杀功能的主要逻辑为判断用户是否登录-->判断是否还有库存-->判断用户是否已经秒杀到-->减库存、下订单、写入秒杀订单。当大量用户访问时,要满足高并发的秒杀场景,解决超卖等问题。

4.防刷功能

利用动态地址,图形验证码,秒杀订单点击频率来防止用户使用刷单软件刷单。

5.数据库

数据库的主要设计为五张表:goods、miaosha_goods、miaosha_user、miaosha_order、order_info。数据库生成语句在sql生成文件.txt中。

系统优化

1.页面缓存

访问商品列表页面时,不是让系统渲染页面,而是从缓存里面取,如果找到返回客户端,如果没有,手动渲染模板,渲染出来之后,把结果输出给客户端,同时把结果缓存到redis里面来,下次就可以使用了。(1.取缓存2.手动渲染模板3.结果输出)缓存是为了避免瞬间访问太多导致服务器压力太大,但是如果说缓存时间太长,数据的及时性就不高了。缓存时间设置在合适的范围。

2.对象缓存

将用户信息设置缓存,缓存用户信息时必须考虑缓存数据和数据库数据保持一致。当用户信息修改时,先修改数据库中的数据,再处理缓存(使缓存失效)。

3.页面静态化

上述的两种缓存,都是利用redis缓存服务器来实现的,虽然可以降低对数据库和服务器的压力,但是,redis服务器的容量和处理能力也是有限的,所以我们可以考虑将页面模板直接缓存到用户的浏览器,那么每次请求用户只需要请求用于渲染的对象即可,这不仅仅减轻了redis服务器的压力,同时也减少了带宽的消耗,此即为页面静态化。 在本项目中,主要实现的是商品详情、订单详情页面、秒杀页面的静态化,主要方法是利用ajax的异步加载,请求渲染需要的对象,并且通过配置 spring.resources的相关参数来告诉浏览器是否缓存,缓存有效时间等等。

4.接口优化

Redis预减库存减少数据库访问,内存标记减少Redis访问,请求先入队缓冲,异步下单,增强用户体验。

5.解决超卖

在秒杀订单表中建立用户id和商品id的联合唯一索引。SQL语句优化,获取库存时设置条件stock_count > 0时才进行减库存。

6.静态资源优化

JS/CSS压缩,减少流量。多个JS/CSS组合,减少连接数。 CDN就近访问等。

系统测试见github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值