素材巴巴 > 程序开发 >

Java高性能高并发秒杀系统设计与优化

程序开发 2023-09-11 08:38:59

项目简介

本项目主要是模拟应对大并发场景下,如何完成商品的秒杀,以及针对秒杀场景下为应对大并发所做的优化。

文章目录

  • 秒杀功能的实现
  • 页面优化技术
  • 接口优化
  • 超卖问题
  • 安全优化
  • 项目地址:https://github.com/noodou/seckill

    项目的技术结构如下图所示:

    技术结构.png

    数据库设计如下图:

    这里的数据库设计只是为了模拟秒杀场景,实际的数据库会复杂很多。需要注意的是,因为参与秒杀的只有部分商品,所以单独建立一个miaosha_goods存储于秒杀商品相关的字段。

    数据库设计.png

    秒杀场景下主要解决的问题:

    登录实现

    登录部分主要有以下几个部分:

    明文密码两次MD5处理

    加密:出于安全考虑

    第一次 (在前端加密,客户端):密码加密是(明文密码+固定盐值)生成md5用于传输,目的,由于http是明文传输,当输入密码若直接发送服务端验证,此时被截取将直接获取到明文密码,获取用户信息。

    加盐值是为了混淆密码,原则就是明文密码不能在网络上传输。

    第二次:在服务端再次加密,当获取到前端发送来的密码后。通过MD5(密码+随机盐值)再次生成密码后存入数据库。

    防止数据库被盗的情况下,通过md5反查,查获用户密码。方法是盐值会在用户登陆的时候随机生成,并存在数据库中,这个时候就会获取到。

    第二次的目的:
    黑客若是同时黑掉数据库,通过解析前端js文件,知道如果md5加密的过程,就知道此时用户的密码。

    但是此时我们要是在后端加入随机盐值和传输密码的md5组合,黑客是无法知道通过后端密码加密过程的,从而无法知道密码。

    JSR303参数检验和全局异常处理器

    JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解。如@NotNull@Email@Max等。

    在这个系统中,我们自定义了一个注解@IsMobile完成手机号码的参数检验,@IsMobile的校验处理器为IsMobileValidator

    定义一个全局异常GlobalException和全局异常处理器GlobalExceptionHandler,可以完成系统异常的捕获和异常的统一处理。

    分布式Session

    在用户登录成功之后,将用户信息存储在redis中,然后生成一个token返回给客户端,这个token为存储在redis中的用户信息的key,这样,当客户端第二次访问服务端时会携带token,首先到redis中获取查询该token对应的用户使用是否存在,这样也就不用每次到数据库中去查询是不是该用户了,从而减轻数据库的访问压力。

    秒杀功能的实现

    页面优化技术

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

    所谓页面缓存,指的是对于服务端的请求,不直接从系统中获取页面资源,而是先从缓存中获取页面资源,如果缓存中不存在页面资源,则系统将渲染页面并存储页面到缓存中,然后将页面返回。

    来看商品列表页的请求过程;请求到服务端,服务端查询数据库中的商品列表信息然后存储在Model对象中࿰


    标签:

    素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。