资料地址1:https://pan.baidu.com/s/1RgHUpR6KoFjvXmkRKwCNwQ 提取码: hc5a
资料地址2:https://share.weiyun.com/ysK13sR2 密码:74m96t
秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注。本文主要介绍有关于秒杀系统的设计和底层实现原理。
一、通过对需求分析,我们提炼出秒杀活动的三大子流程,即:
(运营)创建秒杀活动;
(运营/买家)查看秒杀活动;
(买家)参与秒杀活动;
有了这个整体把握,我们再针对每一个子流程,分析该场景下需要编排哪些产品功能。
二、实现细节记录
1、用户密码两次MD5加密
第一次MD5加密:防止用户明文密码在网络进行传输
第二次MD5加密:防止数据库被盗,避免通过MD5反推出密码,双重保险
2、分布式session维持会话
后端通过验证用户账号密码都正确情况下,通过UUID生成唯一id作为token,再将token作为key、用户信息对象作为value存储到Redis,同时将token存储到cookie,维持会话状态。当用户访问接口时,只需从cookie取出对应的token信息,根据token键值从Redis获取用户对象。
3、异常统一处理
通过自定义拦截器的方式,对所有所有异常进行拦截,并进行相应的处理,然后把结果信息返回给客户端处理。
采用@ControllerAdvice+@ExceptionHandler(value=Exception.class)方式。
4、页面缓存 + 对象缓存
页面缓存:
通过在手动渲染得到的html页面缓存到Redis,下次访问相同页面时直接从Redis中获取进行返回,减少服务端处理的压力。
五、核心代码
package com.fc.v2.controller;
import com.fc.v2.common.base.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
/**
* 如果有前台这儿写前台访问方法
* @ClassName: IndexController
* @author fuce
* @date 2019-10-21 00:15
*/
@Api(tags = "首页模块")
@Controller
public class IndexController extends BaseController{
/**
* 前台访问 域名:端口 例如:localhost:80的get请求
* @param map
* <a href="/user/return" title="@return">@return</a>
* @author fuce
* @Date 2019年11月20日 下午10:55:13
*/
@ApiOperation(value="前台",notes="前台")
@GetMapping("/")
public String index(ModelMap map) {
//直接访问后台用
return "redirect:/admin/login";
//return "index";
}
/**
* 前台访问/index的get请求
* @param map
* <a href="/user/return" title="@return">@return</a>
* @author fuce
* @Date 2019年11月20日 下午10:54:56
*/
@ApiOperation(value="前台",notes="前台")
@GetMapping("/index")
public String index2(ModelMap map) {
//直接访问后台用
//return "redirect:/admin/login"
return "index";
}
}
六、秒杀按钮
大部分用户怕错过秒杀时间点,一般会提前进入活动页面。此时看到的秒杀按钮是置灰,不可点击的。只有到了秒杀时间点那一时刻,秒杀按钮才会自动点亮,变成可点击的。但此时很多用户已经迫不及待了,通过不停刷新页面,争取在第一时间看到秒杀按钮的点亮。从前面得知,该活动页面是静态的。那么我们在静态页面中如何控制秒杀按钮,只在秒杀时间点时才点亮呢?没错,使用js文件控制。为了性能考虑,一般会将css、js和图片等静态资源文件提前缓存到CDN上,让用户能够就近访问秒杀页面。看到这里,有些聪明的小伙伴,可能会问:CDN上的js文件是如何更新的?秒杀开始之前,js标志为false,还有另外一个随机参数。
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)