当前位置: 首页 > news >正文

东阳网站建设报价莆田网站建设建站系统

东阳网站建设报价,莆田网站建设建站系统,松江泗泾网站建设,泰国购物网站大全接口优化 文章目录 接口优化1. 内容概述2. 集成RabbitMQ2.1 下载2.2 SpringBoot集成RabbitMQ 快速入门1.相关配置2.创建发送者者和接收者 2.3 rabbitmq四种交换模式2.4 秒杀接口优化 1. 内容概述 核心思路:减少对数据库的访问#xff0c;利用Redis的高并发特性来实现。 系统初…接口优化 文章目录 接口优化1. 内容概述2. 集成RabbitMQ2.1 下载2.2 SpringBoot集成RabbitMQ 快速入门1.相关配置2.创建发送者者和接收者 2.3 rabbitmq四种交换模式2.4 秒杀接口优化 1. 内容概述 核心思路:减少对数据库的访问利用Redis的高并发特性来实现。 系统初始化把商品库存数量加载到Redis。 //这一步操作确保了在秒杀开始之前商品库存数据已经预加载到Redis中减少了在秒杀开始时对数据库的访问。收到请求Redis预减库存库存不足直接返回否则进入3。 //在收到用户的秒杀请求后首先从Redis中减去相应的商品数量。如果减去后的数量小于0说明商品库存不足直接返回秒杀失败。否则进入下一步。请求入队立即返回排队中。1-3 异步下单 //如果商品库存充足用户的秒杀请求会被放入一个队列中然后立即返回给用户一个正在排队中的信息。这一步操作是异步的即不需要等待队列中的请求全部处理完毕就可以立即返回。请求出队生成订单减少库存。 //当队列中有请求需要处理时就从队列中取出一个请求然后生成相应的订单并从Redis中减去相应的商品数量。客户端轮询是否秒杀成功4-5 并发操作 //客户端在发送秒杀请求后会定时向服务器发送轮询请求询问秒杀是否成功。在这个过程中步骤4和5是并发进行的即服务器的订单生成和库存减少操作以及客户端的轮询操作可以同时进行。 内容模块 Redis预减库存减少数据库访问内存标记减少Redis访问RabbitMQ队列缓冲异步下单增强用户体验RabbitMQ安装与Spring Boot集成访问Nginx水平扩展压测 2. 集成RabbitMQ 2.1 下载 RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现 安装 erlang安装erlang步骤 安装RabbitMQ 这里要注意rabbitmq版本要和erlang版本对应 安装RabbitMQ 这里因为版本问题 rabbitmq一直无法运行 解决https://blog.csdn.net/qq_43616898/article/details/105602839 运行成功 2.2 SpringBoot集成RabbitMQ 快速入门 步骤 添加依赖 spring-boot-starter-amqp创建消息接受者创建消息发送者 1.相关配置 !-- 集成rabbitmq--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency#rabbitmq spring.rabbitmq.host192.168.33.10 spring.rabbitmq.port5672 spring.rabbitmq.usernameguest spring.rabbitmq.passwordguest spring.rabbitmq.virtual-host/ #\u6D88\u8D39\u8005\u6570\u91CF spring.rabbitmq.listener.simple.concurrency 10 spring.rabbitmq.listener.simple.max-concurrency 10 #\u6D88\u8D39\u8005\u6BCF\u6B21\u4ECE\u961F\u5217\u83B7\u53D6\u7684\u6D88\u606F\u6570\u91CF spring.rabbitmq.listener.simple.prefetch 1 #\u6D88\u8D39\u8005\u81EA\u52A8\u542F\u52A8 spring.rabbitmq.listener.simple.auto-startuptrue #\u6D88\u8D39\u5931\u8D25\uFF0C\u81EA\u52A8\u91CD\u65B0\u5165\u961F spring.rabbitmq.listener.simple.default-requeue-rejected true #\u542F\u7528\u53D1\u9001\u91CD\u8BD5 spring.rabbitmq.template.retry.enabledtrue spring.rabbitmq.template.retry.initial-interval1000 spring.rabbitmq.template.retry.max-attempts3 spring.rabbitmq.template.retry.max-interval10000 spring.rabbitmq.template.retry.multiplier1.0package com.example.rabbitmq;import java.util.HashMap; import java.util.Map;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.HeadersExchange; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.TopicExchange; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class MQConfig {public static final String QUEUE queue;Beanpublic Queue queue() {return new Queue(QUEUE, true);} } 2.创建发送者者和接收者 AmqpTemplate对象作用 发送消息允许你发送各种类型的消息如简单文本、JSON、POJOs等到队列、主题或交换机。接收消息通过在方法上使用RabbitListener注解AmqpTemplate可以自动为你处理接收到的消息。连接和断开连接AmqpTemplate提供了连接和断开连接的方法这样你就可以轻松地在你的应用中使用RabbitMQ。错误处理如果在发送或接收消息时发生异常AmqpTemplate可以自动为你处理这些异常。 //创建发送者 Service public class MQSender {private static Logger log LoggerFactory.getLogger(MQSender.class);AutowiredAmqpTemplate amqpTemplate ;public void send(Object message) {String msg RedisService.beanToString(message);log.info(send message:msg);amqpTemplate.convertAndSend(MQConfig.QUEUE, msg);} }//创建接受者Service public class MQReceiver {private static Logger log LoggerFactory.getLogger(MQReceiver.class);AutowiredRedisService redisService;RabbitListener(queuesMQConfig.QUEUE)public void receive(String message) {log.info(receive message:message);}测试 RequestMapping(/mq)ResponseBodypublic ResultString mq(){mqSender.send(nihao,我是mq);return Result.success(hello,mq);}2.3 rabbitmq四种交换模式 以下的图表展示了RabbitMQ四种交换机模式 名称描述Direct Exchange直连交换机根据Routing Key将消息投递到不同的队列。每个队列都会绑定一个交换机和特定的Routing Key。当消息被发送到交换机时它会被送到指定的队列。Fanout Exchange扇出交换机采用广播模式根据绑定的交换机路由到与之对应的所有队列。也就是说如果一个交换机绑定了多个队列消息将会被广播到这些队列。Topic Exchange主题交换机对路由键进行模式匹配后进行投递。这种类型的交换机将根据Routing Key的模式匹配来决定将消息投递到哪个队列。Headers Exchange头交换机不处理Routing Key而是根据发送的消息内容中的headers属性进行匹配。这种类型的交换机将根据消息的headers属性来决定将消息投递到哪个队列。 rabbitmq的四种交换机模式 Configuration public class MQConfig {public static final String MIAOSHA_QUEUE miaosha.queue;public static final String QUEUE queue;public static final String TOPIC_QUEUE1 topic.queue1;public static final String TOPIC_QUEUE2 topic.queue2;public static final String HEADER_QUEUE header.queue;public static final String TOPIC_EXCHANGE topicExchage;public static final String FANOUT_EXCHANGE fanoutxchage;public static final String HEADERS_EXCHANGE headersExchage;/*** Direct模式 交换机Exchange* */Beanpublic Queue queue() {return new Queue(QUEUE, true);}/*** Topic模式 交换机Exchange* */Beanpublic Queue topicQueue1() {return new Queue(TOPIC_QUEUE1, true);}Beanpublic Queue topicQueue2() {return new Queue(TOPIC_QUEUE2, true);}Beanpublic TopicExchange topicExchage(){return new TopicExchange(TOPIC_EXCHANGE);}Beanpublic Binding topicBinding1() {return BindingBuilder.bind(topicQueue1()).to(topicExchage()).with(topic.key1);}Beanpublic Binding topicBinding2() {return BindingBuilder.bind(topicQueue2()).to(topicExchage()).with(topic.#);}/*** Fanout模式 交换机Exchange* */Beanpublic FanoutExchange fanoutExchage(){return new FanoutExchange(FANOUT_EXCHANGE);}Beanpublic Binding FanoutBinding1() {return BindingBuilder.bind(topicQueue1()).to(fanoutExchage());}Beanpublic Binding FanoutBinding2() {return BindingBuilder.bind(topicQueue2()).to(fanoutExchage());}/*** Header模式 交换机Exchange* */Beanpublic HeadersExchange headersExchage(){return new HeadersExchange(HEADERS_EXCHANGE);}Beanpublic Queue headerQueue1() {return new Queue(HEADER_QUEUE, true);}Beanpublic Binding headerBinding() {MapString, Object map new HashMapString, Object();map.put(header1, value1);map.put(header2, value2);return BindingBuilder.bind(headerQueue1()).to(headersExchage()).whereAll(map).match();}} package com.example.rabbitmq;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.example.redis.RedisService; //创建发送者 Service public class MQSender {private static Logger log LoggerFactory.getLogger(MQSender.class);AutowiredAmqpTemplate amqpTemplate ;public void sendMiaoshaMessage(MiaoshaMessage mm) {String msg RedisService.beanToString(mm);log.info(send message:msg);amqpTemplate.convertAndSend(MQConfig.MIAOSHA_QUEUE, msg);}// public void send(Object message) { // String msg RedisService.beanToString(message); // log.info(send message:msg); // amqpTemplate.convertAndSend(MQConfig.QUEUE, msg); // } // public void sendTopic(Object message) {String msg RedisService.beanToString(message);log.info(send topic message:msg);amqpTemplate.convertAndSend(MQConfig.TOPIC_EXCHANGE, topic.key1, msg1);amqpTemplate.convertAndSend(MQConfig.TOPIC_EXCHANGE, topic.key2, msg2);}public void sendFanout(Object message) {String msg RedisService.beanToString(message);log.info(send fanout message:msg);amqpTemplate.convertAndSend(MQConfig.FANOUT_EXCHANGE, , msg);}public void sendHeader(Object message) {String msg RedisService.beanToString(message);log.info(send fanout message:msg);MessageProperties properties new MessageProperties();properties.setHeader(header1, value1);properties.setHeader(header2, value2);Message obj new Message(msg.getBytes(), properties);amqpTemplate.convertAndSend(MQConfig.HEADERS_EXCHANGE, , obj);}} package com.example.rabbitmq;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.example.domain.MiaoshaOrder; import com.example.domain.MiaoShaUser; import com.example.redis.RedisService; import com.example.service.GoodsService; import com.example.service.MiaoshaService; import com.example.service.OrderService; import com.example.vo.GoodsVo;Service public class MQReceiver {private static Logger log LoggerFactory.getLogger(MQReceiver.class);AutowiredRedisService redisService;AutowiredGoodsService goodsService;AutowiredOrderService orderService;AutowiredMiaoshaService miaoshaService;// RabbitListener(queuesMQConfig.MIAOSHA_QUEUE) // public void receive(String message) { // log.info(receive message:message); // MiaoshaMessage mm RedisService.stringToBean(message, MiaoshaMessage.class); // MiaoShaUser user mm.getUser(); // long goodsId mm.getGoodsId(); // // GoodsVo goods goodsService.getGoodsVoByGoodsId(goodsId); // int stock goods.getStockCount(); // if(stock 0) { // return; // } // //判断是否已经秒杀到了 // MiaoshaOrder order orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId); // if(order ! null) { // return; // } // //减库存 下订单 写入秒杀订单 // miaoshaService.miaosha(user, goods); // }// RabbitListener(queuesMQConfig.QUEUE) // public void receive(String message) { // log.info(receive message:message); // }RabbitListener(queuesMQConfig.TOPIC_QUEUE1)public void receiveTopic1(String message) {log.info( topic queue1 message:message);}RabbitListener(queuesMQConfig.TOPIC_QUEUE2)public void receiveTopic2(String message) {log.info( topic queue2 message:message);}RabbitListener(queuesMQConfig.HEADER_QUEUE)public void receiveHeaderQueue(byte[] message) {log.info( header queue message:new String(message));}} 2.4 秒杀接口优化 初始实现秒杀功能 RequestMapping(value/do_miaosha, method RequestMethod.POST)ResponseBodypublic ResultOrderInfo miaosha(Model model, MiaoShaUser user,RequestParam(goodsId)long goodsId) {model.addAttribute(user, user);if(user null) {return Result.error(CodeMsg.SESSION_ERROR);}//判断库存GoodsVo goods goodsService.getGoodsVoByGoodsId(goodsId);//10个商品req1 req2int stock goods.getStockCount();if(stock 0) {return Result.error(CodeMsg.MIAO_SHA_OVER);}//判断是否已经秒杀到了MiaoshaOrder order orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);if(order ! null) {return Result.error(CodeMsg.REPEATE_MIAOSHA);}//减库存 下订单 写入秒杀订单OrderInfo orderInfo miaoshaService.miaosha(user, goods);return Result.success(orderInfo);}核心思路:减少对数据库的访问利用Redis的高并发特性来实现。 系统初始化把商品库存数量加载到Redis。 //这一步操作确保了在秒杀开始之前商品库存数据已经预加载到Redis中减少了在秒杀开始时对数据库的访问。收到请求Redis预减库存库存不足直接返回否则进入3。 //在收到用户的秒杀请求后首先从Redis中减去相应的商品数量。如果减去后的数量小于0说明商品库存不足直接返回秒杀失败。否则进入下一步。请求入队立即返回排队中。1-3 异步下单 //如果商品库存充足用户的秒杀请求会被放入一个队列中然后立即返回给用户一个正在排队中的信息。这一步操作是异步的即不需要等待队列中的请求全部处理完毕就可以立即返回。请求出队生成订单减少库存。 //当队列中有请求需要处理时就从队列中取出一个请求然后生成相应的订单并从Redis中减去相应的商品数量。客户端轮询是否秒杀成功4-5 并发操作 //客户端在发送秒杀请求后会定时向服务器发送轮询请求询问秒杀是否成功。在这个过程中步骤4和5是并发进行的即服务器的订单生成和库存减少操作以及客户端的轮询操作可以同时进行。
http://www.dnsts.com.cn/news/161784.html

相关文章:

  • 网站升级改版需要几天镇江网页设计
  • php服装商城网站建设爱美刻在线制作网站
  • 湖南做网站 n磐石网络wordpress调用视频
  • 专业做网站建闵行区
  • 奉贤集团网站建设广告公司起名用字大全
  • 国外 家具 网站模板下载做资源教程网站
  • 网站改版新闻做网站常用的软件
  • 有没有好的网站门户网站是指
  • 网站做301重定向福州免费项目建设管理系统
  • 电子商务网站建设信息wordpress 最受欢迎文章
  • 惠州网站建设优化wordpress自定义html5
  • 建站之星快速建站价格深圳最新消息今天新增
  • 企业管理网站建设网站的空间怎么查
  • 军队房地产与建设工程法律实务在哪个网站可以购买虚拟主机wordpress解压位置
  • 国际摄影作品网站政务中心网站自身建设
  • 建设工程方面的资料在哪个网站下载比较方便河南省路桥建设集团网站
  • 安嶶省城乡建设网站嘉祥县建设局网站
  • 在线销售型的网站电子商务的就业方向
  • 网站建设专家哪家强作文网课哪家好
  • 有网站了怎么做app普通网站可以做商城
  • 大连做网站优化公司360提交网站
  • 郑州优化网站公司广东seo外包服务
  • 加强网站备案管理专业小程序商城开发
  • 驾校网站模版泰安人才网官网登录
  • 做网站 想做成宽屏的网站域名费会计分录怎么做
  • 公司网站域名注册流程万网域名注册备案
  • 梁山做网站的公司虚拟会员商城网站分销
  • 优秀网站设计欣赏图片页面效果好的网站
  • 网站的付款链接怎么做的石家庄建设网站的公司
  • 怎么做社交网站网址缩短在线生成app