java秒杀系统方案优化高性能并发实战
久许
朋友拍了拍我,说我可不是什么幺蛾子
展开
-
1 eclipse创建maven项目,快速搭建spring boot项目
如果是首次创建maven项目,可能打开工程的时候会进行一些配置,需要等待10来分钟。配置完成之后:原创 2018-05-10 21:31:34 · 572 阅读 · 0 评论 -
6-1 接口优化
1、Redis预减库存减少数据库访问2、内存标记减少Redis访问3、请求先入队缓存,异步下单,提高用户体验。4、RabbitMQ安装与Spring Boot集成5、Nginx水平扩展6、压测核心是减少数据库访问。1、系统初始化,把商品数量加载到Redis2、收到请求,Redis预减库存3、请求入队,立即返回排队中(因为现在还不知道最终会成功还是失败)4、请求出队,生成订单(只允许10个,进入队列...翻译 2018-05-27 13:58:21 · 324 阅读 · 0 评论 -
2-2 使用ajax进行登陆
1、首先定义类 loginVo,用于保存从表单提交的数据(相当于request,保存了表单中js代码中提交的data)。因为登陆的时候需要输入手机号和密码,其中手机号2、登陆表单中js代码如下(使用jquery提供的ajax的异步提交的功能)3、domain层的定义如下,在后面加上setter和getter方法即可:4、dao层的定义如下,dao层是直接和数据库打交道的。5、service等的定义...翻译 2018-05-22 22:58:24 · 175 阅读 · 0 评论 -
集成RabbitMQ
一、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>二、添加配置信息#rabbitmqspring.rabbitmq...翻译 2018-05-28 00:28:19 · 867 阅读 · 0 评论 -
2-3 jsr303参数校验和全局异常处理
1、定义注解(IsMobile),规则①在 LoginController类中:public Result<Boolean> doLogin(@Valid LoginVo loginVo) {//loginVo 相当于是表单之中提交的数据②在LoginVo类中:import com.mydre.miaosha.validator.IsMobile;public class LoginV...翻译 2018-05-23 11:41:24 · 1116 阅读 · 0 评论 -
2-4 分布式session
当软件在实际运行过程中,往往有多台服务器为用户提供服务。所以有可能用户的第一次http请求落在了第一个服务器上,第二个http请求落在了第二个服务器上。如果把session保存在服务器上的话,需要服务器做同步,如果服务器有很多个的话,同步就会消耗大量资源。这里采用将...翻译 2018-05-24 08:29:11 · 174 阅读 · 0 评论 -
请求入队,客户端轮询
一、客户端轮询<script>function getMiaoshaResult(goodsId){//做一个查询 g_showLoading();//加载中 $.ajax({ url: '/miaosha/result', //调用后台轮询功能的接口 type: "GET", data: {//post提交表单的时候,url参数可以放在data中 goodsId: goo...翻译 2018-05-29 10:04:59 · 796 阅读 · 1 评论 -
隐藏秒杀接口地址
<script>function getMiaoshaPath(){ $.ajax({ url: '/miaosha/generate_path', //调用后台接口获取秒杀接口的入口地址 type: "GET", data: {//post提交表单的时候,url参数可以放在data中 goodsId: $("#goodsId").val() }, success:fun...翻译 2018-05-29 13:15:48 · 2197 阅读 · 1 评论 -
算术表达式图形验证码的实现
goods_detail.html<script>function getMiaoshaPath(){ var verifyCode = $("#verifyCode").val(); if(verifyCode == ""){ layer.msg("请输入结果"); return false; } $.ajax({ url: '/miaosha/generate_path', ...翻译 2018-05-29 18:59:03 · 1678 阅读 · 0 评论 -
3-1 数据库设计
1、商品表create table `goods`( `id` bigint(20) primary key not null auto_increment comment '商品ID', `goods_name` varchar(16) default null comment '商品名称', `goods_title` varchar(64) default null comment '商品标...翻译 2018-05-24 21:16:01 · 2974 阅读 · 0 评论 -
3-2 商品列表页
GoodsController类中定义如下:package com.mydre.miaosha.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.*;import org.spring...翻译 2018-05-24 21:24:50 · 384 阅读 · 0 评论 -
3-3 商品详情页
1、对应的GoodsDao中的核心代码为: @Select("select g.*, mg.stock_count, mg.miaosha_price, mg.start_date, mg.end_date from miaosha_goods mg left join goods g on mg.goods_id = g.id where mg.goods_id = #{id}") public...翻译 2018-05-24 21:35:28 · 1191 阅读 · 0 评论 -
5-5 订单详情静态化
为秒杀做优化,为秒杀订单加缓存package com.mydre.miaosha.redis;public class OrderKey extends BasePrefix{ private OrderKey(String prefix){ super(prefix); } public static OrderKey getMiaoshaOrderByUidGid = new OrderKe...翻译 2018-05-27 01:26:12 · 643 阅读 · 0 评论 -
5-4 秒杀静态化
Get:幂等的 无论调用多少次,从服务端返回的结果都是一样的,并且不会对服务端的数据产生影响。Post:不是幂等的,向服务端提交数据,对服务端的数据造成影响 @RequestParam("goodsId")long goodsId) 对应:function doMiaosha(){//秒杀的时候,需要向服务端传递参数 $.ajax({ url: '/miaosha/do_miaosha', ...翻译 2018-05-26 22:06:01 · 243 阅读 · 0 评论 -
2 封装 json 输出
spring的controller有两个层面的含义。1、rest api json 输出 2、页面1、然后自己把上述图片所示的json数据进行封装。需要新建包:com.mydre.miaosha.result。包中首先新建类 Result,然后写入如下代码:package com.mydre.miaosha.result;/*由于数据的类型还不知道,可能是对象,也可能是数组(数组中存在好多对...原创 2018-05-11 07:20:20 · 458 阅读 · 0 评论 -
3 使用thymeleaf做页面模板(spring-boot 集成 thymeleaf)
要使用thymeleaf做页面模板,需要两步。一、添加依赖二、进行配置(需要定制化的时候就需要配置)一、在pom.xml中添加如下代码: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thyme...原创 2018-05-11 22:45:01 · 1445 阅读 · 0 评论 -
4 集成mybatis
1、添加pom依赖: mybatis-spring-boot-starter2、添加配置: mybatis*3、添加mysql客户端、druid连接池依赖原创 2018-05-12 10:38:27 · 191 阅读 · 0 评论 -
5 linux 源码安装 redis
首先,在redis官网上下载redis。然后使用winScp将其上传到/usr/local文件夹下[root@localhost local]# ll总用量 1700drwxr-xr-x. 2 root root 6 11月 5 2016 bindrwxr-xr-x. 2 root root 6 11月 5 2016 etcdrwxr-xr-x. 2 root root...原创 2018-05-12 14:47:51 · 242 阅读 · 0 评论 -
6 spring-boot 集成 redis
集成redis,需要:1、添加Jedis依赖,添加Fastjson依赖2、添加配置Fastjson用于将json对象序列化为json字符串,其优点是序列化之后仍然是明文可读的。然后再存入到redis服务器里面。一、添加依赖,在pom.xml中添加如下代码: <dependency> <groupId>redis.clients</groupId> <...翻译 2018-05-12 18:29:04 · 220 阅读 · 0 评论 -
2-1 设计登陆表, 两次MD5加密
1、数据库设计2、明文密码两次MD5处理3、JSR303参数校验+全局异常处理器4、分布式Session1、数据库设计:设计登录表 miaosha_user:2、明文密码两次MD5处理http在网络中是通过明文来进行传输的,如果用户登陆时输入的用户名和密码不做处理。那么如果数据包对别人截取到了,就能过得到数据包中的明文密码。两次MD5:第一次加密: 将用户输入的明文密码加上固定Salt 之后进行M...翻译 2018-05-13 08:22:01 · 2544 阅读 · 0 评论 -
3-4 订单详情页
首先MiaoshaController类,因为生成订单之前要进行秒杀。其中,@RequestParam是获取表单提交的name属性中value①判断秒杀商品的库存。MiaoshaController:GoodsVo goodsVo = goodsService.getOneGoodsVoById(goodsId);int stockCount = goodsVo.getStockCount();i...翻译 2018-05-25 13:51:42 · 1494 阅读 · 0 评论 -
5-1 页面缓存 和 url缓存
一、页面缓存1、定义GoodsKeypackage com.mydre.miaosha.redis;public class GoodsKey extends BasePrefix{ private GoodsKey(int expireSeconds, String prefix){ super(expireSeconds, prefix); } public static GoodsKey ...转载 2018-05-26 10:23:51 · 1076 阅读 · 0 评论 -
thought of java
1、使用Run Configuration可以使maven上的spring boot项目热部署2、去除@ResponseBood,返回的字符串对应页面,不去除的话对应的是字符串。 @RequestMapping("/to_login") public String toLogin() { return "login"; }...原创 2018-05-22 10:38:05 · 157 阅读 · 0 评论 -
5-2 对象缓存
对象级缓存一、token缓存下面是通过token开获取缓存的,被UserArgumentResolver所调用。getByToken只对应一个用户,在用户的登陆成功的同时就存入了redis数据库当中了。MiaoshaUser user = redisService.get(MiaoshaUserKey.token, token, MiaoshaUser.class);getByToken方法只是在...翻译 2018-05-26 14:43:22 · 240 阅读 · 0 评论 -
5-3 页面静态化
页面静态化:页面是存为html,动态的数据是通过接口来从服务端进行获取的。所以服务端只需要写接口。极大的节省网络流量,提高响应速度。这种技术越来越流行,越来越多的公司开始使用这种技术。页面静态化,就是前后端分离。前端技术越来越多,越来越火的比如angularjs,vue.js本次静态化利用的是浏览器的缓存。一、首先在static文件夹下新建文件goods_detail.htm, 后缀名变了,为了防...翻译 2018-05-26 19:05:22 · 332 阅读 · 0 评论 -
定义拦截器,接口限流防刷
一、自定义注解package com.mydre.miaosha.access;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Re...翻译 2018-05-30 00:59:32 · 1506 阅读 · 0 评论