springboot 秒杀系统(一)
秒杀系统应该是很检验一个人的能力的项目。包括从前端
到运营商到nginx到后端等等,很多地方可以优化。
前端的页面控制,运营商的CDN加速,nginx的动静分离等
下面我来一步一步实现后端的秒杀功能的一步一步实现和优化。
后端接口
1,获取商品详情,2,秒杀接口
获取商品:参数 商品ID 通过商品ID返回商品详情。
秒杀接口:参数 商品ID 后端接收商品ID,判断是否有库存,
没有:返回已售完
有:库存-1,创建订单,返回秒杀成功
测试工具 jmeter 测试这2个接口的QPS(每秒处理请求数)
期望结果: 商品能够正常秒杀,不能出现超卖等异常,QPS越高越好。
1.0版本: 不借用其他中间件和优化,正常的操作数据库。实现功能
/*** 秒杀一般只限购1个,所以数量都是1* @return 1 成功 0 失败*/public int secKill(String seckillId,String userid){/*** 第一步:判断当前时间是否在秒杀时间段内* 第二步:判断是否有库存:有 库存减一 没有直接返回售完* 第三步:创建订单,返回成功*///判断当前时间是否在秒杀时间段内JSONObject jsonObject = productService.findById(seckillId);if(jsonObject==null){return 0;}if(judgeTime(jsonObject.getTimestamp("starttime"),jsonObject.getTimestamp("endtime"))){return 0;}//更新库存减一,成功返回1,失败返回0int isSelfOut = productDao.updataNumById(seckillId);if(isSelfOut==0) {return 0;}//创建订单orderDao.createOrder(seckillId,userid);return 1;}/*** 如果当前时间在秒杀时间端,返回false,不在返回true* @param starttime* @param endtime* @return*/private boolean judgeTime(Timestamp starttime, Timestamp endtime) {Date date = new Date();return !(date.getTime()>starttime.getTime()&&date.getTime()<endtime.getTime());}
判断是否有库存,有 减一 SQL<!-- 这里做判断是否有库存和数量减一操作,
如果库存大于1,则 更新记录返回 1
如果库存等于,更新失败,返回 0
所以是不会出现超卖的现象-->
<update id="updataNumById">
update seckill set inventory=inventory-1
where seckillId=#{seckillId} and inventory>0
</update>
秒杀商品表 :ID,商品名,库存数,开始时间,结束时间:
测试计划:jmeter并发1000。获取商品传入商品ID,秒杀接口传入商品ID和随机11位用户ID
测试结果: 如下图,商品接口 qps 110 秒杀 qps 68,这个跟电脑配置有关。
订单表500表记录,商品表1000的库存变为0,没有出现超卖现象,逻辑正常,数据一致性
第一个版本是正常的没有借用其他组件的,下个博客在此基础上一步步优化。
springboot 秒杀系统(一)相关推荐
- SpringBoot + 秒杀系统
本书源码 https://github.com/huangwenyi10/spring-boot-book-v2 目录 创建 秒杀系统 雏形 小结 详情 高并发优化 流量削峰 创建 解决 Cannot ...
- SpringBoot秒杀系统
秒杀系统库存 今天带来一套秒杀库存扣减 涉及到单体架构和集群架构 希望能给你们带来帮助 我也不想学 但是bgs不教 首先讲一下大致的扣减库存的思路 @RequestMapping("dedu ...
- Springboot秒杀系统(乐观锁+RateLimiter令牌+Redis缓存)
本文主要是利用springboot,实现一个单机版秒杀demo,通过单机版实现,可以对基本并发秒杀的知识有一定的了解. 首先先提供秒杀业务实现类: /*** spring 注解加在实现类*/ @Ser ...
- springboot 秒杀系统(二)redis
上一步我们做的秒杀虽然在操作上没问题, 但性能上能有很大的提升空间. 我们可以先把秒杀数据加载到内存中,考虑到以后服务集群化, 所以加载的数据不存放在JVM中,而存在放redis 首先,我们都知道,r ...
- 商城模块java_Java商城秒杀系统实战系列~构建SpringBoot多模块项目
摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...
- SpringBoot开发案例从0到1构建分布式秒杀系统
前言 最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场景 ...
- SpringBoot实现Java高并发秒杀系统之DAO层开发(一)
SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...
- java 模块 分工_Java秒杀系统实战系列~构建SpringBoot多模块项目
摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...
- 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
第一章 1-1课程整体介绍.mp4 1-2核心技术列表.mp4 1-3课程要求与收益.mp4 1-4系统的整体演示.mp4 https://www.jianshu.com/writer#/notebo ...
最新文章
- 洛谷-P1896 [SCOI2005]互不侵犯
- 对计算机应用的认识100,计算机应用基础
- 4月27日云栖精选夜读丨阿里CMO董本洪:你要运营流量,更要运营超级用户
- 高并发01_synchronized
- PIC单片机入门_MPLAB 集成开发环境和 MPASM编译器
- QTCreator使用MSVC编译开发配置问题、VS2015开发qt问题
- java有装箱和拆箱吗_Java中装箱和拆箱,你真的都懂么?
- Hadoop 大数据平台架构与实践
- tomcat:Cannot find /usr/local/tomcat1/bin/setclasspath.sh
- Linux vi 行尾 ctrl,linux中vi使用技巧常用技巧和高级替换
- div中字符串自动换行
- Gephi教程实战:从入门到精通
- 改进网易云音乐的“音乐社交”构想
- 记录一次使用python来实现雷神加速器自动恢复时间和暂停时间的脚本
- 『解题报告』数学 - Standard Deviation (标准差) - UVA10886
- 星巴克招人!要技术大拿。
- 生活中人们通过计算机网络进行信息交流,浅谈网络计算机应用
- 嵌入式AI —— 6. 为糖葫芦加糖,浅谈深度学习中的数据增广
- 我的世界java版好玩的种子_《我的世界》种子详细推荐大全!还不知道有什么好玩的种子?...
- Java自学,Java面试,Java培训
热门文章
- Android 编译IJKPlayer源码
- LINUX 用户认证
- html5技术有哪些新特性,28个你必须知道的HTML5的新特性,技巧以及技术
- Ubuntu出现插入网线提示没有线缆插入的解决方案
- Windows下kali子系统安装教程
- 360度舵机和180度舵机控制方法小结
- 贪吃蛇小游戏--Java代码
- ECCV2020双料冠军团队,带你7日攻克目标检测
- (2014年9月)全国计算机等级考试上机考试题库:2级c百度云,全国计算机等级考试上机考试题库:二级C...
- 计算机网络技术专业英文介绍,计算机网络技术类专业英文简历模板