秒杀项目及细节优化
该项目是实现一个秒杀系统,采用前后端分离,实现的功能包括用户登录,查看商品列表,秒杀,秒杀商品详情,订单等业务功能,同时利用页面缓存,url缓存,对象缓存,页面静态化,rabbitmq异步下单等一系列措施来提高项目的并发能力,使用Jmeter对系统进行压测时,开启5000个线程循环10次同时访问,QPS由1312优化到2154。
数据库设计:共5张表:goods(商品表)+ miaosha_goods(秒杀商品表) + miaosha_user(用户表)+ miaosha_order(秒杀订单表)+ order_info(订单详情表)
第一次加密:从input文本框向form表单提交数据的时候,使用MD5+salt第一次加密;目的是:http在网络上是明文传输的,防止有人在网络上截取到明文密码,导致密码泄露; 第二次加密:用ajax请求服务端时,再次对密码进行加密,并将该密码存入数据库中;目的是:防止数据库被盗,被人利用反推MD5的工具来反推密码,做双重保险;
由于我们的应用程序不可能总是跑在一个服务器上的,在多台服务器中为了处理用户的Session信息,可以用UUID生成一个随机的token值,将他写入Cookie中同时保存在Redis中,传递给客户端,客户端在随后的访问 中上传这个token,服务器根据token值来获取用户的Session信息;
当代码中总是对用户账号,密码进行判空等一系列验证时,为了更方便则实现JSR303将用户账号,密码的验证从业务代码中剥离出来;以及为了统一处理异常信息,实现全局异常处理器,拦截所有的异常信息并对之做相应的处理;
把用户经常访问,但页面数据很少发生更改的情况下(如:商品列表),可以将html页面存入到Redis中 把用户信息、token等数据进行缓存,利用缓存来减少对数据库的访问,大大加快查询速度
静态化页面是指纯html,将页面缓存在用户的浏览器上,不用和服务端进行交互,通过js/ajax请求服务端拿到动态数据来渲染页面
实现思路:
(1)系统初始化时,将商品库存加载到Redis中
(2)收到请求后,Redis预减库存(用内存标记做进一步优化),库存不足则直接返回失败,否则跳入3
(3)请求入队,立即返回排队中(类似于12306买火车票的排队中)
(4)请求出队,减少库存,生成订单
(5)客户端轮询,看是否秒杀成功
(1).秒杀地址隐藏:秒杀开始前是从服务端获取路径,拼起来完整的路径才是真正的秒杀接口地址
(2).数字公式验证码:点击秒杀前,先让用户计算数学公式验证码,目的:为了防止机器人刷单;为了分散请求,削减并发量
(3).接口限流防刷:为防止用户恶意刷系统,限制用户每min的访问次数