- 主要技术栈
- 前端
- Thymeleaf,封装Result结果
- Bootstrap
- JQuery,前后端分离,JSON数据传输
- 后端
- SpringBoot
- JSR303参数验证+全局异常处理器
- MyBatis
- 中间件
- RabbitMQ,实现异步下单,提高高并发可用性
- Redis,集成Jedis
- Druid
- 前端
- 登录功能
- 两次MD5
- 用户端:PASS = MD5(明文+固定Salt)
- 服务端:PASS = MD5(用户输入+随机Salt)
- JSR303校验
- 自定义校验器,实现通过注解完成校验,减少重复代码
- 全局通用异常处理
- 自定义全局异常,出现不符合要求的情况,统一抛出该异常,避免用返回值来处理
- 自定义全局异常处理器,根据异常类型,返回对应的Result
- 分布式Session
- 将cookie中保存的token作为key,用户信息作为value,保存到redis中,这样通过redis就可以查询到是某个用户发起的请求
- 通过集成WebMvcConfigurerAdapter,编写配置类,重写addArgumentResolvers方法,实现HandlerMethodArgumentResolver接口,完成自定义参数解析器,使得User可以作为变量,在方法调用时直接封装,减少重复代码。
- 两次MD5
- 页面优化技术
- 页面缓存+对象缓存
- 页面缓存
- 取缓存,查询缓存中是否有当前页面的缓存
- 手动渲染模板,未查询到缓存后,查询数据库并手动渲染模板,设定过期时间并将模板保存到缓存中
- 结果输出
- 对象缓存
- 将热点数据保存到redis中
- 对对象处理后,并完成数据库更新后,再删除或更新redis中的数据。
- 页面缓存
- 页面静态化,前后端分离
- 通过前后端分离,减少数据交互,提高QPS。
- 页面缓存+对象缓存
- 防止超卖
- 数据库更新时,利用数据库的锁,当且仅当库存大于等于1时才更新数据库,避免出现两个用户同时抢到最后一个商品。
- 利用唯一索引,关联用户ID和商品ID,避免用户同时发起两个请求,导致同一个用户抢到两个。
- 接口优化
- Redis预减库存减少数据库访问
- 预加载秒杀商品到Redis
- 收到请求后,Redis预减库存,这样可以减少大量的数据库查询。
- 请求入队,返回排队中,异步下单
- 请求出兑,生成订单,减少库存
- 客户端轮训,是否秒杀成功。
- 内存标记减少Redis访问
- 本地保存一个标志位,标记秒杀是否结束,减少Redis的访问
- Redis预减库存减少数据库访问
- 秒杀接口地址隐藏
- 将接口带上PathVariable参数
- 添加生成地址的接口
- 收到请求后,先验证PathVariable
- 数学公式验证码
- 输入验证码,分散用户请求
- 防止机器人