文章内容输出来源:拉勾教育Java高薪训练营

环境介绍

服务器: 阿里云Centos7.4

JDK版本: jdk1.8
RocketMQ版本: 4.5.1

安装RocketMQ

wget https://archive.apache.org/dist/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip

启动nameserver

# 1.启动
NameServermqnamesrv
# 2.查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log

启动broker

mqbroker -n localhost:9876
# 2.查看启动日志
tail -f ~/logs/rocketmqlogs/broker.log

基于RocketMQ设计秒杀实现逻辑


这里的超时支付使用redis过期回调处理

核心代码 :


@Component
@RocketMQMessageListener(topic = "springboot-mq",consumerGroup = "springboot-mq-consumer-1")
public class Consumer implements RocketMQListener<OrderInfo> {@ResourceOrderInfoMapper orderInfoMapper;@ResourceWarehouseMapper warehouseMapper;@AutowiredStringRedisTemplate redisTemplate;@Overridepublic void onMessage(OrderInfo orderInfo) {System.out.println("消费订单消息");orderInfoMapper.insert(orderInfo);System.out.println(orderInfo.getId()+"订单入库");Warehouse warehouse = warehouseMapper.selectByPrimaryKey(orderInfo.getCommodity());warehouse.setNum(warehouse.getNum()-1);System.out.println("扣减库存");warehouseMapper.updateByPrimaryKey(warehouse);redisTemplate.opsForValue().set("order:"+orderInfo.getId(),"",15,TimeUnit.SECONDS);}}
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {@ResourceOrderInfoMapper orderInfoMapper;@ResourceWarehouseMapper warehouseMapper;@AutowiredStringRedisTemplate redisTemplate;public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}public void onMessage(Message message, byte[] pattern) {String expireKey = message.toString();if (expireKey.startsWith("order:")){Integer orderId = Integer.valueOf(expireKey.replace("order:",""));OrderInfo orderInfo = orderInfoMapper.selectByPrimaryKey(orderId);orderInfo.setStatus(2);orderInfoMapper.updateByPrimaryKeySelective(orderInfo);System.out.println("订单失效,库存还原+1");Warehouse warehouse = warehouseMapper.selectByPrimaryKey(orderInfo.getCommodity());warehouse.setNum(warehouse.getNum()+1);warehouseMapper.updateByPrimaryKey(warehouse);redisTemplate.opsForValue().increment("num");}}}
@Service
public class OrderService {@ResourceOrderInfoMapper orderInfoMapper;@AutowiredStringRedisTemplate redisTemplate;@Autowiredprivate RocketMQTemplate rocketMQTemplate;public Integer submitOrder(Integer commodity){Integer id = getOrderNum();OrderInfo orderInfo = new OrderInfo();orderInfo.setId(id);orderInfo.setCommodity(commodity);orderInfo.setStatus(0);boolean flag = subtractStock(1);if(!flag){return -1;}rocketMQTemplate.convertAndSend("springboot-mq",orderInfo);return id;}public Integer pay(Integer id){Boolean delete = redisTemplate.delete("order:" + id);System.out.println(delete);if(delete){return 1;}return 0;}/*** 模拟订单号* @return*/public Integer getOrderNum(){Random random = new Random();return random.nextInt(10000);}/*** Redis乐观锁实现秒杀* @param num* @return*/public boolean subtractStock(Integer num) {String key = "num";redisTemplate.setEnableTransactionSupport(true);redisTemplate.watch(key);Object value = redisTemplate.opsForValue().get(key);if (value == null) {//前提 提前将商品库存放入缓存 ,如果缓存不存在,视为没有该商品return false;}//先检查 库存是否充足Integer stock = Integer.valueOf(value.toString());if (stock < num) {System.out.println("库存不足");return false;}redisTemplate.multi();Long newStock = redisTemplate.opsForValue().increment(key, -num.longValue());System.out.println(newStock);List<Object> exec = redisTemplate.exec();if(exec!=null && exec.size()>0){return true;}return false;}
}

写在最后
工作几年,一直都没有去体系化的学习,很多东西没有复杂的工作场景经验,去年综合几家机构,最后还是决定报了拉勾的高薪训练营,在这里也是实实在在的学习到了很多,学完掌握程度也比之前深了很多,而且还有定期的内推,多了更多的机会,真的对我有了很大的帮助提升。

基于RocketMQ设计秒杀相关推荐

  1. 如何基于RocketMQ设计一套全链路消息不丢失方案?

    我们使用MQ作为消息中间件,传输一些消息的时候,必须考虑到消息丢失的可能.因为有的时候消息丢失了,会产生很严重的后果,比如消息计费数据,跟钱有关的消息. 这篇文章我们以RocketMQ为例来讲解,如何 ...

  2. 基于rocketMq秒杀系统demo

    基于RocketMQ设计秒杀. 要求: 1.     秒杀商品LagouPhone,数量100个. 2.     秒杀商品不能超卖. 3.     抢购链接隐藏 4.     Nginx+Redis+ ...

  3. 实战:基于 RocketMQ 的电商高并发秒杀场景

    内容简介: "秒杀"这一业务场景在如今已经不是什么新鲜名词,它本质上属于短时突发性高并发访问问题,业务特点如下: 定时触发,流量在瞬间突增: 秒杀请求中常常只有部分能够成功: 秒杀 ...

  4. 春招高频面试题:怎样设计秒杀系统?

    前言 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个 ...

  5. 基于 RocketMQ 的基金数字化陪伴体系的架构实践

    作者|伍振河 本文以博时基金的金融场景为案例,阐述 RocketMQ 在提升客户陪伴效率和丰富金融场景化能力等方面的提升作用. 行业背景 基金公司的核心业务主要分为两部分,一部分是投研线业务,即投资管 ...

  6. 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

    作者 | 陈厚道  冯庆 来源 | 阿里巴巴云原生公众号 导读:本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实 ...

  7. 博时基金基于 RocketMQ 的互联网开放平台 Matrix 架构实践

    简介: Matrix 经过一年多的建设,目前已具备多渠道统一接入.第三方生态互联互通.基金特色交易场景化封装等功能特性.Matrix 通过建设有品质.有温度的陪伴,从技术上和体验上,让用户理解风险,理 ...

  8. 大神手把手教你设计秒杀架构模型

    中生代技术 链接技术大咖,分享技术干货 全文:4000字 作者:Yrion 原文首发:https://www.cnblogs.com/wyq178/p/11261711.html 前言:秒杀系统相信很 ...

  9. 秒杀限制人群,如何设计秒杀服务的限流策略?

    对于秒杀业务,大家应该比较熟悉了.比如,"某商品原价 1299 元, 双十一整点秒杀价仅 500 元,限量 100 件,先到先得" 等等.通过这段文案我们能够发现,参与秒杀活动商品 ...

最新文章

  1. 使用Varnish+ESI实现静态页面的局部缓存
  2. linux 设置网络
  3. 数据中心机房建设几个重要的国家标准
  4. windows 搭建kms服务器激活_自建KMS激活服务器的两种方法
  5. java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Ribbon
  6. php下的原生ajax请求
  7. Vue中富文本编辑器的使用
  8. webservice CXF入门服务端
  9. windows下用XShell远程ubuntu时连接失败
  10. ubuntu man命令彩色高亮显示
  11. 【Matlab】Matlab2014修改默认工作目录
  12. 图像质量评价指标MSE/PSNR/SSIM
  13. heartbeat高可用详解
  14. The JAVA_HOME environment variable is not defined correctly(亲测有效)
  15. 和生活一起理解51单片机① 如何入门学习单片机
  16. 2020工商银行信息技术岗校招笔试经历
  17. Echarts 饼图设置标签颜色(单个标签颜色、多个标签颜色)
  18. 数据类型在内存中的存储原理
  19. 阿里云python自测答案_阿里云技能测试python初级中级高级
  20. 高性能永磁交流伺服电机系统控制策略

热门文章

  1. swoole基础之http-server
  2. 再见了,MySQL之父!
  3. 1.二分排序——抓老鼠法
  4. 还我一个奇迹——记僵尸3的遗憾和美丽
  5. 语义分析(semantic analysis)概述
  6. 规避三方工具带给产品的潜在风险
  7. 拍照怎么测量尺寸?这些方法可以了解一下
  8. b站前端老猫总结面试题
  9. 在cmd下import cv2报错——OpenCV实现BRISK
  10. 金鸽BL102,无需编程可直接对接Thingsboard平台