秒杀系统应该是很检验一个人的能力的项目。包括从前端

到运营商到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 秒杀系统(一)相关推荐

  1. SpringBoot + 秒杀系统

    本书源码 https://github.com/huangwenyi10/spring-boot-book-v2 目录 创建 秒杀系统 雏形 小结 详情 高并发优化 流量削峰 创建 解决 Cannot ...

  2. SpringBoot秒杀系统

    秒杀系统库存 今天带来一套秒杀库存扣减 涉及到单体架构和集群架构 希望能给你们带来帮助 我也不想学 但是bgs不教 首先讲一下大致的扣减库存的思路 @RequestMapping("dedu ...

  3. Springboot秒杀系统(乐观锁+RateLimiter令牌+Redis缓存)

    本文主要是利用springboot,实现一个单机版秒杀demo,通过单机版实现,可以对基本并发秒杀的知识有一定的了解. 首先先提供秒杀业务实现类: /*** spring 注解加在实现类*/ @Ser ...

  4. springboot 秒杀系统(二)redis

    上一步我们做的秒杀虽然在操作上没问题, 但性能上能有很大的提升空间. 我们可以先把秒杀数据加载到内存中,考虑到以后服务集群化, 所以加载的数据不存放在JVM中,而存在放redis 首先,我们都知道,r ...

  5. 商城模块java_Java商城秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  6. SpringBoot开发案例从0到1构建分布式秒杀系统

    前言 最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场景 ...

  7. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

  8. java 模块 分工_Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  9. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)

    第一章 1-1课程整体介绍.mp4 1-2核心技术列表.mp4 1-3课程要求与收益.mp4 1-4系统的整体演示.mp4 https://www.jianshu.com/writer#/notebo ...

最新文章

  1. 洛谷-P1896 [SCOI2005]互不侵犯
  2. 对计算机应用的认识100,计算机应用基础
  3. 4月27日云栖精选夜读丨阿里CMO董本洪:你要运营流量,更要运营超级用户
  4. 高并发01_synchronized
  5. PIC单片机入门_MPLAB 集成开发环境和 MPASM编译器
  6. QTCreator使用MSVC编译开发配置问题、VS2015开发qt问题
  7. java有装箱和拆箱吗_Java中装箱和拆箱,你真的都懂么?
  8. Hadoop 大数据平台架构与实践
  9. tomcat:Cannot find /usr/local/tomcat1/bin/setclasspath.sh
  10. Linux vi 行尾 ctrl,linux中vi使用技巧常用技巧和高级替换
  11. div中字符串自动换行
  12. Gephi教程实战:从入门到精通
  13. 改进网易云音乐的“音乐社交”构想
  14. 记录一次使用python来实现雷神加速器自动恢复时间和暂停时间的脚本
  15. 『解题报告』数学 - Standard Deviation (标准差) - UVA10886
  16. 星巴克招人!要技术大拿。
  17. 生活中人们通过计算机网络进行信息交流,浅谈网络计算机应用
  18. 嵌入式AI —— 6. 为糖葫芦加糖,浅谈深度学习中的数据增广
  19. 我的世界java版好玩的种子_《我的世界》种子详细推荐大全!还不知道有什么好玩的种子?...
  20. Java自学,Java面试,Java培训

热门文章

  1. Android 编译IJKPlayer源码
  2. LINUX 用户认证
  3. html5技术有哪些新特性,28个你必须知道的HTML5的新特性,技巧以及技术
  4. Ubuntu出现插入网线提示没有线缆插入的解决方案
  5. Windows下kali子系统安装教程
  6. 360度舵机和180度舵机控制方法小结
  7. 贪吃蛇小游戏--Java代码
  8. ECCV2020双料冠军团队,带你7日攻克目标检测
  9. (2014年9月)全国计算机等级考试上机考试题库:2级c百度云,全国计算机等级考试上机考试题库:二级C...
  10. 计算机网络技术专业英文介绍,计算机网络技术类专业英文简历模板