使用RabbitMQ+Redis实现秒杀系统

一、简介

在这里插入图片描述

秒杀系统就是电商系统的一种形式,通过设计秒杀模块来应对实际电商平台中最考验系统架构的部分。

秒杀系统特点:业务简单(卖家查询,买家下订单减库存),瞬时并发量高。

二、设计思路

核心思路是通过缓存,异步,限流来保证系统的高并发和高可用。
设计思路:
将请求拦截在系统上游,降低下游压力
充分利用缓存:利用缓存可极大提高系统读写速度
消息队列:消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动拉取请求信息进行业务处理。

三、SpringBoot版的简单实现

使用环境 jdk 8 、SpringBoot 2.7.3、 MySQL8.3、Redis 、RabbitMQ
工具 idea2022.2 、sqLyog、 Apifox+Jmeter

3.1、数据库的搭建

库存表
在这里插入图片描述
订单表
在这里插入图片描述

3.2 SpringBoot文件创建

pom 文件编写
使用redis和mq和fastjson2和swagger-annotations(使用R统一返回值类型)
在这里插入图片描述
** 项目架构**
在这里插入图片描述
common 公共类
调用了ok和error来返回成功或失败
在这里插入图片描述

调用message code data

在这里插入图片描述
config配置类
RedisConfig
将redis序列化排列使得传出的对象简洁明了
在这里插入图片描述
RedissionConfig
配置一个redis的分布式锁
在这里插入图片描述

    Redis 实现分布式锁主要步骤
        指定一个 key 作为锁标记,存入 Redis 中,指定一个 唯一的用户标识 作为 value。
        当 key 不存在时才能设置值,确保同一时间只有一个客户端进程获得锁,满足 互斥性 特性。
        设置一个过期时间,防止因系统异常导致没能删除这个 key,满足 防死锁 特性。
        当处理完业务之后需要清除这个 key 来释放锁,清除 key 时需要校验 value 值,需要满足 只有加锁的人才能释放锁 。

RabbitConfig
RabbitMQ的配置类
在这里插入图片描述
application.yml配置在这里插入图片描述
实体类
orders 类,Inventory同理
在这里插入图片描述
mapper数据持久层
orderMapper
提交订单的方法
在这里插入图片描述

InventoryMapper
修改库存方法 ,查询库存方法 ,查表内库存信息方法
在这里插入图片描述

映射文件
在这里插入图片描述
service数据服务层
业务层接口
order提交订单业务 在这里插入图片描述
开机更新数据库库存到redis库业务
在这里插入图片描述

实现类
库存启动更新到redis的操作
在这里插入图片描述

订单实现类
redisson是调用生成锁的方法 rabbitTemplate使用Mq传递消息
在这里插入图片描述

订单操作流程如下
controller传入Orders对象
在这里插入图片描述
在这里插入图片描述

impl接受到值order
在这里插入图片描述

生成一个分布式锁,判断锁是否超时
在这里插入图片描述

调用redis库中的库存 根据我们之前传入的key值查询
在这里插入图片描述

判断redis库存值是否满足订单的需求,若满足执行 让inventory.set一个新的库存值。redis库存不足订单需求时,就要停止卖了。
在这里插入图片描述
在这里插入图片描述

拿到新的值后向redis库中传入新的值 依旧根据 key :value 的方式
在这里插入图片描述

这时我们redis的库已经修改了,给用户返回的信息显示的就是已经购买到了。此时使用mq来作为一个传信员传递信息给数据库让他修改库存。因为redis的响应速度大于mysql,当redis缓存成功时。我们让mq发一个消息让数据库慢慢地修改库存就行了。
在这里插入图片描述

这时这条消息会传到指定队列上我们写一个实现类来操作这条信息
在这里插入图片描述
这样数据库才真的修改了。逻辑的最后要关闭锁,把锁交给下一个线程使用。
在这里插入图片描述
controller数据控制层
controller层是用来接受前台数据和返回页面请求信息的,所有我们定义的请求方式和传参类型,前后端要保持一致。
在这里插入图片描述

在这里插入图片描述

启动测试
数据库存250
在这里插入图片描述

redis库存启动传入
在这里插入图片描述

压力测试发送请求 一个线程就是一个http请求 我们使用jmeter发送1000个
在这里插入图片描述

前边的线程可以买到
在这里插入图片描述

依次出现抢到抢不到的现象
在这里插入图片描述

到最后真的没有了
在这里插入图片描述

数据库和redis也没有成负值,没有超卖

在这里插入图片描述

总结

这是我个人的思路总结,有很多方面其实都没有那么完美,只是对高并发的一个模拟实现。期待大家的指正。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: RabbitMQRedis都可以用来实现秒杀系统RabbitMQ是一种消息队列系统,可以用来处理高并发的请求。在秒杀系统中,可以将用户的请求放入RabbitMQ队列中,然后由多个消费者同时处理请求,从而提高系统的并发处理能力。 Redis是一种高性能的缓存系统,可以用来存储秒杀商品的库存和用户的购买记录。在秒杀系统中,可以将商品库存和用户购买记录存储在Redis中,通过Redis的原子操作来保证数据的一致性和并发性。 综合使用RabbitMQRedis可以实现一个高并发、高可用、高性能的秒杀系统。 ### 回答2: 秒杀是指在一段时间内,通过限时抢购的方式,以较低的价格购买商品的活动。然而,在高并发的情况下,很容易导致系统崩溃或用户抢购失败。为了解决这个问题,可以使用消息队列技术来实现秒杀。 RabbitMQRedis都是常用的消息队列系统。RabbitMQ是基于AMQP(高级消息队列协议)实现的消息队列系统,支持多种开发语言和多个操作系统。Redis是一种高速追踪和存储数据的内存数据库,支持多种数据结构和多种开发语言。在实现秒杀场景中,RabbitMQRedis都有其优点和不足。 使用RabbitMQ实现秒杀,可以将秒杀请求发送到消息队列中进行处理。秒杀请求由客户端发送到RabbitMQ服务器,RabbitMQ服务器将秒杀请求存储在队列中。接着,消费者从队列中取出秒杀请求,检查商品数量和用户限购数量。如果符合要求,就执行秒杀操作,更新商品库存和用户购买记录。若不符合要求,则拒绝秒杀请求。这种方式可以避免高并发下的请求超时和系统崩溃。 使用Redis实现秒杀,可以将商品数量和用户限购数量缓存在Redis中。通过Redis的原子操作和分布式锁,保证在高并发的情况下,商品数量和用户限购数量的更新是线程安全的。当有用户发起秒杀请求时,先检查商品数量和用户限购数量,如果符合要求,则扣减商品数量和用户限购数量。若不符合要求,则拒绝秒杀请求。这种方式可以提高系统性能和并发量。 需要注意的是,无论是使用RabbitMQ还是Redis,都需要合理设置消息队列或缓存的容量和性能,以提高系统的吞吐量和响应速度。此外,还需要设计合理的数据库模型和商品限购逻辑,保证系统的正确性和稳定性。 ### 回答3: 秒杀活动常常是电商平台的重要营销方式,它的核心就是处理高并发请求的能力。而在实现这个功能的时候,rabbitmqredis往往被选择使用RabbitMQ是一个消息中间件,它是完全开源的,支持多种消息队列协议。它的工作原理是将消息发送到中间件,等待消费者来处理。在秒杀中,RabbitMQ通常被用来处理请求的排队、分发和处理。整个秒杀的流程可以按照以下步骤实现: 1. 用户请求秒杀,请求通过消息队列发送给RabbitMQ。 2. RabbitMQ将请求放到队列中,等待处理。 3. 服务器端根据队列中请求的数量和服务器负载情况,决定分配处理请求的线程池数量。 4. 消费者从队列中取出请求,并进行后续处理逻辑(如库存数量减少、订单生成等)。 5. 处理完成后,响应处理结果给消费者。 Redis是一个高性能的键-值存储系统。它可以将数据缓存在内存中,使得数据的读写速度非常快。Redis实现秒杀中的作用通常是作为商品库存的缓存,用来缓解订单处理时对于数据库的压力。Redis一般应用在以下几个方面: 1. 商品库存缓存:秒杀活动中,商品库存量是关键数据,如果库存的数据异常,将会影响整个系统的正常运转。将库存缓存在Redis中,可以避免频繁访问数据库,提升处理速度。 2. 活动限制:秒杀活动通常会有限制条件,如用户每次秒杀数量、秒杀时间等。将这些数据存储到Redis中,可以方便地更新和查询。 3. 订单数据流:将订单数据缓存在Redis中,可以加速后续处理逻辑,如订单数据流水化、财务数据统计等。 综合来看,RabbitMQRedis在秒杀中所扮演的角色是互补的。RabbitMQ用于处理高并发的请求排队、分发和处理,而Redis用于缓存商品库存、活动限制和订单数据流,从而提升整个系统的性能和吞吐量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值