基于spring boot高性能高并发秒杀系统方案及优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_43126117/article/details/103226706

项目源码:https://github.com/yingyingqiqi/flash

这是电商系统的一个模块,主要涉及秒杀这个应用场景,但是,里面的知识却超越了秒杀,涉及到高并发、高性能的系统构建(缓存+异步+限流)

闲扯:这篇文章是对慕课网“Java秒杀系统方案优化 高性能高并发实战”课程的学习总结,以及自己的一些看法和改良,很久之前看的课程了,现在二刷,并加上一些示意图,方便自己或者他人理解秒杀涉及到的技术。

文章整体思路介绍:

1.完成一些基础的工具类开发,分布式会话、原生redis的API集成、参数的效验及解析、秒杀的初步构想。

2.秒杀的优化,各种加缓存、异步化、防刷限流。

3.这篇文章不讲代码的实现,主要讲思路,给出示意图,方便理解。

技术栈:spring+ spring boot+ mybatis+ +redis+ rabbitmq+ 前端技术知识

秒杀未优化前示意图

1.一句话讲清楚瓶颈:无缘无故,时时刻刻请求数据库,数据库并发是很小的。

未优化前

页面级高并发秒杀优化(Redis缓存+静态化分离)

使用不同层级和粒度的缓存对系统做优化改造,比如:对服务端手动渲染商品列表做页面缓存,对商品详情静态化来利用客户端浏览器的缓存,对热点数据做对象级的缓存

重点:手动渲染商品列表做页面缓存

1.第一部分已经介绍了,页面时通过thymeleaf构建视图(你可以理解为jsp),thymeleaf是spring推荐使用

2.手动渲染视图,将渲染结果存入redis中。用户请求时,直接返回redis中的html

3.当页面需要显示用户信息的时候,这种方式是不适合的。

手动渲染页面缓存

重点:页面静态化(利用浏览器的缓存) 即前后端分离

1.页面静态化,也称前后端分离,服务端配置,用户请求,服务器响应时,不返回数据,只返回html纯页面。

2.此纯html页面,通过Ajax向服务端第二次请求,获取所需数据。

页面静态化

非编程的优化,静态资源优化

重点:秒杀接口第一次优化

1.此次优化,主要解决超卖问题,并没有涉及很深入的优化

秒杀第一次优化

服务级高并发秒杀优化(RabbitMQ+接口优化)

将通过预减库存减少透穿到DB的请求,通过异步处理和排队机制缓解数据库的压力,降低应用接口负载,主要包括内存标记,Redis做库存预判,消息队列异步写库,秒杀接口优化。

重点:秒杀接口第二次优化

1.系统初始化,把商品库存数量加载到redis,建立内存标记(hashMap),减少redis访问(网络请求延时)。

2.redis预减库存,库存不足,直接返回失败,减少用户请求向下访问。

3.建立消息队列,请求入队,秒杀实际操作延迟执行,即异步写库,直接返回提示(排队等待)。

4.请求出队,减少库存,生成订单,订单存入redis中,等待轮询结果。

5.前端发送Ajax请求轮询秒杀结果。(类似12306买票,排队中)

图形验证码及恶意防刷

隐藏秒杀地址,实现图形验证码,接口限流防刷,列表页和详情页防刷,秒杀操作防刷,验证码防刷等。

重点:接口地址隐藏

1.第一次请求服务端获取一串随机字符(每个用户唯一60秒失效),url拼上字符才是实际地址。

2.接口地址的隐藏,类似接口防止重放攻击,实际地址中带入一串字符,请求到达服务端,验证字符。

3.可以设计的再复杂一点,随机字符只可以使用一次,请求第一次到达后失效。

接口地址隐藏

重点:接口防刷限流(同一ip一秒钟访问多少次)

1.使用springMVC的HandlerInterceptorAdapter拦截器,实现抽象类preHandler方法

2.这里优化第一部分的参数解析器,对于获取user用户信息的步骤。利用ThreadLocal (线程安全的容器)存储user用户信息。

3.通过拦截器,拦截使用AccessLimit注解的方法,并获取注解的数据,检查访问次数是否超出限制,没超限制放行此方法。

接口防刷限流

秒杀压测-Jmeter压力测试

压力测试神器-JMeter,由于单机部署,mysql,redis,jdk等都在一部机器上。大致压测结果为(5000个用户10次请求):

QPS 商品列表 秒杀接口 优化前 920 950 优化后 2540 2103

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术栈cwnait

运营商劫持狠起来,连json都改

运营商劫持,是常见的流氓手段,它们老少通吃,连孩子都不放过,经常嚣张的在右下角或者网页头尾,弹出一些羞羞的广告。这让正在辅导孩子功课的妈妈,很难解释。

9330
来自专栏Python无止境

轻松掌握 Linux 命令(1):ls 命令

ls 命令是 linux 下最常用的命令。ls 命令就是 list 的缩写,缺省下用来打印出当前目录的清单。如果 ls 指定其他目录,那么就会显示指定目录里的文...

7020
来自专栏编程创造城市

零基础学网页开发入门(制作博客案例)适应手机端div+css+js的综合介绍

html翻译一下:hype text mark language 超文本标记语言

8130
来自专栏机器视觉CV

OpenCV 可视化工具

OpenCV 传统的调试方式是 cv2.imshow() cv2.waitKey() ,即显示一张图片,然后查看之后再销毁它, 这个操作实在是太不方便了,如果调...

9610
来自专栏志学Python

带你认识 flask 个人主页和头像

作为创建个人主页的第一步,让我们为其URL /user/ 新建一个对应的视图函数。

7120
来自专栏一猿小讲

聊起 BigTable,让你不再胆怯

GFS 作为其中一驾宝车,解决了大数据存储的难题。它能够把大量廉价的普通机器,聚在一起,充分让每台廉价的机器发挥光和热。其中在《从谷歌 GFS 架构设计聊开去》...

5510
来自专栏渗透云笔记

关于js拿shell的尝试

以前在测试一个网站的时候,大佬提供了一个拿shell的思路,通过js拿到了shell。

5810
来自专栏HT

H5 + WebGL 实现的地铁站 3D 可视化系统

工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领...

9020
来自专栏渗透云笔记

乌云——任意密码重置总结

找这个漏洞时候,先把流程过一遍,两遍,观察数据包,测试时候就可以比较哪个不一样,就可以知道修改什么了。

11320
来自专栏前端之旅

AJAX 与跨域通信(三):跨域解决方案

承接上文,继续补充跨域方案:postMessage、location.hash、WebSocket、Nginx 反向代理、Nodejs 中间件代理。

6740

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励