秒杀系统 - rabbitmq从零到会用

本文介绍了如何将RabbitMQ集成到SpringBoot应用中,详细讲解了RabbitMQ的4种交换机模式,并针对秒杀系统提出优化方案。在优化中,利用消息队列处理秒杀请求,通过Redis查询库存,请求入队并返回排队状态,前端通过轮询查询秒杀结果。同时,提供了后端秒杀接口、消息发送、队列配置及接收消息的代码示例。
摘要由CSDN通过智能技术生成

安装

我在服务器上用命令的时候报错了,建议使用其他方式,比如Ubantu无网环境下安装RabbitMQ(使用.deb包)

SpringBoot集成RabbitMQ

  1. 添加依赖(版本取决于parent)
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-amqp</artifactId>
      </dependency>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
  </parent>

添加“parent”标签里的内容后,“spring-boot-starter-parent”会为开发者提供常用jar的版本管理,所以我们不需要指定版本,使用人家提供好的就可以了。
2.application.properties 中添加配置信息:

spring.rabbitmq.host=121.4.2##.2## (主机ip)
spring.rabbitmq.port=5672          (端口号)
spring.rabbitmq.username=sun       (登录账号)
spring.rabbitmq.password=666	   (登录密码)
spring.rabbitmq.virtual-host=/     (虚拟主机)

RabbitMQ的4种交换机模式

RabbitMQ四种交换机类型介绍

优化秒杀系统

优化思路

1.从redis中查库存,库存不足直接返回,否则进入2。
2.请求进入消息队列,返回排队中的状态。
3.请求出队,下订单减库存。
4.前端轮询,查询是否秒杀成功。

后端代码

秒杀接口

	public static HashMap<Long, Boolean> localOverMap =  new HashMap<Long, Boolean>();

	@PostMapping(value="/do_miaosha")
	@ResponseBody
	public Result<Integer> miaosha(Model model,MiaoshaUser user,
								   @RequestParam("goodsId")Long goodsId) {
    
		//内存标记,减少redis访问
		Boolean over = localOverMap.get(goodsId);
		if(over!=null && over) {
   
			return Result.error(CodeMsg.MIAO_SHA_OVER);
		}
		//预减库存
		long stock = redisService.decr(GoodsKey.getGoodsStock, ""+goodsId);//10
		if(stock < 0) {
   
			localOverMap.put(goodsId, true);
			return Result.error(CodeMsg.MIAO_SHA_OVER);
		}
		//判断是否已经秒杀到了
		MiaoshaOrder order = orderService.getOrderByUserAndGoods(user.getId(), goodsId);
		if(order != null) {
   
			return Result.error(CodeMsg.REPEATE_MIAOSHA);
		}
		//入队
		Message mm = new Message(user,goodsId); 
		sender.send(mm);
		return Result.success(0);//排队中
	} 

Sender.java用来发送消息

@Service
public class Sender {
   
    public static Logger logger = LoggerFactory.getLogger(Receiver.class); 
    @Autowired
    AmqpTemplate amqpTemplate; 
    public void send(Message msg){
   
        String msgstr = RedisService.beanToString(msg);  //把bean转为String
        amqpTemplate.convertAndSend(MQConfig.Queue1,msgstr);
    }
}

MQConfig.java用来定义队列

@Configuration
public class MQConfig<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛阳八中我最棒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值