Java秒杀系统

目录

第一章 项目框架搭建 

第二章 实现登录功能

数据库设计

明文密码两次MD5处理

JSR303参数校验+全局异常处理器

分布式session

第三章 实现秒杀功能

数据库设计

商品列表页

商品详情页

秒杀功能实现

订单详情页

第四章 JMeter压测

JMeter入门

自定义变量模拟多用户

JMeter命令行使用

Redis的压测工具redis-benchmark

Spring Boot打war包

第五章 页面优化技术

页面缓存+URL缓存+对象缓存

页面静态化,前后端分离

静态资源优化

CDN优化

解决超卖问题

第六章 接口优化

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

内存标记减少Redis访问

系统初始化时,把商品的库存加载到Redis

请求先入队缓冲,异步下单,增强用户体验

Nginx水平扩展

压测

第七章 安全优化

秒杀接口地址隐藏

数学公式验证码

接口的限流防刷

第八章 总结


第一章 项目框架搭建 

  • 1 Spring Boot环境搭建
  • 2 集成Thymeleaf,Result结果封装
  • 3 集成mybatis+Druid

导入启动项,在application.properties写入相关的配置。可以使用声明式事务控制

  • 4 集成Jedis+Redis安装+通用缓存key封装

安装Redis

启动Redis:在cmd下切到redis目录:cd C:\Program Files\Redis-x64-3.0.504然后使用命令:redis-server redis.windows.conf

在另一个cmd下使用redis-cli来使用redis

修改配置文件

哪台机器能访问这个redis,因为做分布式所以要设置所有机器能访问

设置密码

可以将redis加入系统的服务(加不进去不知道为啥,每次用手动启动)

Redis和springboot集成:

依赖:

添加Jedis依赖

添加Fastjson依赖:序列化时将java对象转化成json字符串写到redis服务器中(序列化后可读,方便查看)

配置:

通过ConfigurationProperties注解可以将配置文件有关redis的配置项读取进来并赋值给相应属性

将代表Redis配置信息的RedisConfig的类通过@Component添加到容器中

通过JedisPool获取Jedis对象,通过Jedis对Redis进行操作,在插入数据的时候,将bean转换为string插入,获取数据的时候将str转换为对应的bean(使用fastjson)

出现的问题:多个人向redis中插入的数据key相同会将数据覆盖?

解决思路:在进行插入数据的时候加入前缀,比如用户数据表,前缀就为USER(前缀可通过插入数据类型的类名获得)

模板模型:接口定义需要实现的功能,抽象类定义通用方法,实现类实现特有的方法.

通过KeyPrefix类来生成带有前缀的key,最终的key为:类名+指定的prefix+原来的key

第二章 实现登录功能

数据库设计

明文密码两次MD5处理

用户端passMD5加密后传入服务端,服务端得到用户端传来的pass再进行MD5存入数据库。

第一次MD5防止用户密码在网络上传输不安全,第二次MD5若数据库被盗防止被反查找出密码。

静态文件

bootstrap画页面

jquery-validation错误表单验证

layer做弹框

md5

jquery

common应用自己的

登录功能实现:使用正则表达式判断mobile是否格式正确.用户输入密码时,先进行MD5

加固定盐值的加密再进行传输,传到服务端后,服务端根据mobile获取用户信息,包括password和salt,取这个salt对这个密码再进行一次MD5加密,最终和数据库的password比较,若相同登录成功,若不同,登陆失败.

JSR303参数校验+全局异常处理器

JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来

登录时参数校验

现在需要校验的参数上加@Valid标签

然后在需要校验对象的属性中:

可以使用自带的注解进行参数校验,也可以自己写参数校验规则,如@IsMobile

全部异常处理:

拦截异常以更友好的形式呈现而不是exception的堆栈,捕捉到异常放回Result包装codemsg。在进行登陆的时候,若验证不成功,直接抛异常,将异常交给全局异常来进行处理,代码更加简洁

/**
 * 在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、
 * @InitBinder、@ModelAttribute,并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中。
 * 可以将异常拦截进行处理
 */
@ControllerAdvice
@ResponseBody
public class GlobleExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public Result<String> exceptionHandler(HttpServletRequest request,Exception e){
        if(e instanceof BindException){
            BindException ex = (BindException) e;
            List<ObjectError> error = ex.getAllErrors();
            ObjectError error1 = error.get(0);
            String msg = error1.getDefaultMessage();
            return Result.error(CodeMsg.BIND_ERROR.fillArgs());
        }else{
            return Result.error(CodeMsg.SERVER_ERROR);
        }
    }
}

分布式session

//Token是一个字符串,是一段根据特殊规则生成的唯一的、保存在缓存服务器(如Redis)中的key,这个key对应的value是用户账户
// 数据。每个用户登录后,服务器生成一个类似Token并缓存,之后用户每次请求中都要带上这个Token,以便实现类似
// 于HTTP Session的会话跟踪。

把session信息存放到第三方缓存中

在第一次登录的时候,生成一个随机的token,将token:user存入redis中,同时将token存入cookie中返回给客户端,客户端下次请求的时候携带上这个token就可以获取用户信息。将seesion存入缓存中。

问题:每次生成新的token存入redis,怎么把旧的删除

WebMvcConfigurerAdapter

分布式session相关

第三章 实现秒杀功能

数据库设计

设置单独的秒杀商品表和秒杀订单表而不是在商品或订单后面加一个标识标识其为秒杀商品:活动很多难以维护

 问题:使用mybatis generator逆向工

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值