基于SpringBoot + MySQL + Redis + RabbitMQ + Guava开发的高并发商品限时秒杀系统

1,系统介绍 本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录,查看商品列表,秒杀,下单等功能,项目中还针对高并发情况实现了系统缓存

本文包含相关资料包-----> 点击直达获取<-------

1.系统介绍

本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。

2.开发工具

IntelliJ IDEA + Navicat + Sublime Text3 + Git + Chrome

3.压测工具

JMeter

4.开发技术

前端技术 :Bootstrap + jQuery + Thymeleaf

后端技术 :SpringBoot + MyBatis + MySQL

中间件技术 : Druid + Redis + RabbitMQ + Guava

5.秒杀优化方向

  1. 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、降级等措施来最大化减少对数据库的访问,从而保护系统。

  2. 充分利用缓存:秒杀商品是一个典型的读多写少的应用场景,充分利用缓存将大大提高并发量

6.实现技术点

1. 两次MD5加密

将用户输入的密码和固定Salt通过MD5加密生成第一次加密后的密码,再讲该密码和随机生成的Salt通过MD5进行第二次加密,最后将第二次加密后的密码和第一次的固定Salt存数据库

好处:

  1. 第一次作用:防止用户明文密码在网络进行传输
  2. 第二次作用:防止数据库被盗,避免通过MD5反推出密码,双重保险

2. session共享

验证用户账号密码都正确情况下,通过UUID生成唯一id作为token,再将token作为key、用户信息作为value模拟session存储到redis,同时将token存储到cookie,保存登录状态

好处: 在分布式集群情况下,服务器间需要同步,定时同步各个服务器的session信息,会因为延迟到导致session不一致,使用redis把session数据集中存储起来,解决session不一致问题。

3. JSR303自定义参数验证

使用JSR303自定义校验器,实现对用户账号、密码的验证,使得验证逻辑从业务代码中脱离出来。

4. 全局异常统一处理

通过拦截所有异常,对各种异常进行相应的处理,当遇到异常就逐层上抛,一直抛到最终由一个统一的、专门负责异常处理的地方处理,这有利于对异常的维护。

5. 页面缓存 + 对象缓存

  1. 页面缓存:通过在手动渲染得到的html页面缓存到redis
  2. 对象缓存:包括对用户信息、商品信息、订单信息和token等数据进行缓存,利用缓存来减少对数据库的访问,大大加快查询速度。

6. 页面静态化

对商品详情和订单详情进行页面静态化处理,页面是存在html,动态数据是通过接口从服务端获取,实现前后端分离,静态页面无需连接数据库打开速度较动态页面会有明显提高

7. 本地标记 + redis预处理 + RabbitMQ异步下单 + 客户端轮询

描述:通过三级缓冲保护,1、本地标记 2、redis预处理 3、RabbitMQ异步下单,最后才会访问数据库,这样做是为了最大力度减少对数据库的访问。

实现:

  1. 在秒杀阶段使用本地标记对用户秒杀过的商品做标记,若被标记过直接返回重复秒杀,未被标记才查询redis,通过本地标记来减少对redis的访问
  2. 抢购开始前,将商品和库存数据同步到redis中,所有的抢购操作都在redis中进行处理,通过Redis预减少库存减少数据库访问
  3. 为了保护系统不受高流量的冲击而导致系统崩溃的问题,使用RabbitMQ用异步队列处理下单,实际做了一层缓冲保护,做了一个窗口模型,窗口模型会实时的刷新用户秒杀的状态。
  4. client端用js轮询一个接口,用来获取处理状态

8. 解决超卖

描述:比如某商品的库存为1,此时用户1和用户2并发购买该商品,用户1提交订单后该商品的库存被修改为0,而此时用户2并不知道的情况下提交订单,该商品的库存再次被修改为-1,这就是超卖现象

实现:

  1. 对库存更新时,先对库存判断,只有当库存大于0才能更新库存
  2. 对用户id和商品id建立一个唯一索引,通过这种约束避免同一用户发同时两个请求秒杀到两件相同商品
  3. 实现乐观锁,给商品信息表增加一个version字段,为每一条数据加上版本。每次更新的时候version+1,并且更新时候带上版本号,当提交前版本号等于更新前版本号,说明此时没有被其他线程影响到,正常更新,如果冲突了则不会进行提交更新。当库存是足够的情况下发生乐观锁冲突就进行一定次数的重试。

9. 使用数学公式验证码

描述:点击秒杀前,先让用户输入数学公式验证码,验证正确才能进行秒杀。

好处: 1. 防止恶意的机器人和爬虫 2. 分散用户的请求

实现: 1. 前端通过把商品id作为参数调用服务端创建验证码接口 2. 服务端根据前端传过来的商品id和用户id生成验证码,并将商品id+用户id作为key,生成的验证码作为value存入redis,同时将生成的验证码输入图片写入imageIO让前端展示 3. 将用户输入的验证码与根据商品id+用户id从redis查询到的验证码对比,相同就返回验证成功,进入秒杀;不同或从redis查询的验证码为空都返回验证失败,刷新验证码重试

10. 使用RateLimiter实现限流

描述:当我们去秒杀一些商品时,此时可能会因为访问量太大而导致系统崩溃,此时要使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;降级后的处理方案可以是:返回排队页面(高峰期访问太频繁,等一会重试)、错误页等。

实现:项目使用RateLimiter来实现限流,RateLimiter是guava提供的基于令牌桶算法的限流实现类,通过调整生成token的速率来限制用户频繁访问秒杀页面,从而达到防止超大流量冲垮系统。(令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务


本项目是学习了imooc网视频之后的个人理解和知识汇总,学习链接:https://coding.imooc.com/class/168.html

参考文献

  • 分布式架构下的电商平台的设计与实现(吉林大学·杨振生)
  • 一个基于微服务的个性化电商系统的设计与实现(华中科技大学·胡梦婷)
  • 基于Dubbo框架的购物商城的设计和实现(北京交通大学·赵冲冲)
  • 一个基于微服务的个性化电商系统的设计与实现(华中科技大学·胡梦婷)
  • 某订单秒杀系统的设计与实现(北京邮电大学·侯成程)
  • 电子商城系统中订单模块与秒杀模块的设计与实现(南京大学·徐士川)
  • 基于亚马逊网络服务的优惠商品搜索发布系统(吉林大学·徐诗垚)
  • 一个基于微服务的个性化电商系统的设计与实现(华中科技大学·胡梦婷)
  • 面向中小型B2C的电商平台的限时促销和秒杀功能的设计与实现(西南交通大学·于晓林)
  • 某订单秒杀系统的设计与实现(北京邮电大学·侯成程)
  • 基于Dubbo框架的购物商城的设计和实现(北京交通大学·赵冲冲)
  • 在线商品限时购活动管理系统的设计与实现(华中科技大学·吴晨)
  • 一个基于微服务的个性化电商系统的设计与实现(华中科技大学·胡梦婷)
  • 基于Dubbo框架的购物商城的设计和实现(北京交通大学·赵冲冲)
  • 基于Dubbo框架的购物商城的设计和实现(北京交通大学·赵冲冲)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码港湾 ,原文地址:https://m.bishedaima.com/yuanma/35721.html

相关推荐

  • 基于Python实现ID3算法

    1,作业任务 编程实现 ID3 算法,针对下表数据,生成决策树, ID color size act age inflated 1 YELLOW SMALL STRETCH ADULT T 2 YELLOW SMALL STRETCH CHILD T 3 YELLOW SMALL DIP CHILD F 4 YELLOW LARGE STRETCH ADULT T 5 YELLOW LARGE DIP ADULT T 6 YELLOW LARGE DIP CHILD F 7 PURPLE SMALL STRETCH CHILD T 8 PURPLE SMALL DIP ADULT T 9 PURPLE SMALL DIP CHILD F 10 PURPLE LARGE STRETCH CHILD T 问题提示:可设计数据文件格式
    2024年05月14日
    2 1 1
  • 基于Python实现多项式拟合正弦函数

    1, 实验目的 掌握最小二乘法求解(无惩罚项的损失函数),掌握加惩罚项(2 范数)的损失函数优化,梯度下降法,共轭梯度法,理解过拟合,克服过拟合的方法(如加惩罚项
    2024年05月14日
    30 1 7
  • 基于SpringBoot框架的小学生身体素质测评管理系统

    这是一套采用Java语言编写的🌟🌟SpringBoot框架下的小学生健康评估管理系统源代码🌟🌟,项目中融入了Vue技术,开发工具为Idea或Eclipse,此系统适用于小学生成长健康的评估
    2024年05月23日
    6 1 1
  • 基于SSM和mysql的个人博客系统

    基于SSM和mysql的个人博客系统 摘 要 随着互联网的发展,博客在自由和共享的精神的影响下应运而生,博客的出现让我们有更多机会在日常生活中向他人展示自己的观点和信息
    2024年05月14日
    30 1 6
  • 基于Java的寝室公共财产管理系统

    基于Java的寝室公共财产管理系统 摘 要 我们所学的《java面向对象》和我们以前所学的C++大同小异,整体上差不多却有各有各的特点,在学习了理论课程之后
    2024年05月14日
    3 1 2
  • 科技星球-web作业

    科技星球 实验目的 1,科技星球项目的设计与实现; 实验环境 个人笔记本电脑,win10 操作系统,编译器为 IntelliJ IDEA 2020
    2024年05月14日
    22 1 4
  • 基于SpringBoot框架的技术的在线考试系统

    这是一套采用Java编程语言,基于SpringBoot框架构建的🔥🔥在线考试平台源代码🔥🔥,项目中融入了Vue技术,支持使用Idea或Eclipse进行开发,该系统适用于毕业设计或课程设计任务
    2024年05月23日
    26 1 6
  • 基于Java+JSP+Mysq+Servletl的校园卡一卡通管理系统

    这是一个🔥🔥基于JSP+Mysq+Servletl的校园卡一卡通管理系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 校园卡管理系统开发技术栈为JSP项目
    2024年05月23日
    31 1 4
  • 基于php的病历管理系统项目源码+报告

    这是一个🔥🔥基于php的病历管理系统项目源码+报告🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 病历管理系统开发技术栈为Php项目,可以作为毕业设计课程设计作业使用php技术设计开发一个病历管理系统
    2024年05月23日
    19 1 2
  • 基于SpringBoot框架的网上摄影工作室

    这是一份采用🔥🔥SpringBoot为核心的网上摄影工作室系统的源代码实现🔥🔥,主要编程语言为Java,并结合了SpringBoot和Vue技术栈进行开发,开发工具包括Idea或Eclipse
    2024年05月23日
    15 1 1

发表回复

登录后才能评论