系列九、Java操作RocketMQ之顺序消息

一、概述

        消息有序指的是可以按照消息发送的顺序来消费(FIFO),RocketMQ可以严格的保证消息有序,按照分区的不同,可以分为分区有序和全局有序。顺序消费的原理解析,在默认情况下消息发送会按照轮询的方式把消息发送到不同的Queue中(说明:一个Broker中有四个Queue),消费者消费消息的时候会从多个Queue上拉取消息,这种情况下消费者是无法顺序消费生产者发送的消息的。但是如果控制发送的顺序消息只依次发送到同一个Queue中,那么消费的时候只能从这个Queue上拉取,这种方式即为全局有序,虽然保证了顺序消费,但是效率比较低。再说说分区有序,分区有序是指有多个Queue参与,相对于每个Queue,消息都是有序的,可以类比当前网购的流程,一般都是:创建订单==》扣减库存==》增加积分,下面参考案例代码

二、案例代码

2.1、pom

        同案例五

2.2、RocketMQConstant

        同案例五

2.3、消费者

2.3.1、DLJDOrderConsumer1

package org.star.orderly.consumer;import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.common.message.MessageExt;
import org.star.constants.RocketMQConstant;import java.util.List;/*** @Author: 一叶浮萍归大海* @Date: 2023/8/25 16:23* @Description: 顺序消息消费者*/
@Slf4j
public class DLJDOrderConsumer1 {public static void main(String[] args) throws Exception {DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("DLJDOrderConsumerGroup");consumer.setNamesrvAddr(RocketMQConstant.NAME_SERVER_ADDR);consumer.subscribe("DLJDOrderTopic", "*");consumer.registerMessageListener(new MessageListenerOrderly() {@Overridepublic ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {if (CollectionUtils.isNotEmpty(list)) {list.forEach(e -> {log.info("我是消费者DLJDOrderConsumer1,当前线程:{},队列ID:{},收到消息:{}",Thread.currentThread().getName(),e.getQueueId(), StrUtil.utf8Str(e.getBody()));});}return ConsumeOrderlyStatus.SUCCESS;}});consumer.start();log.info("DLJDOrderConsumer1 start success");}}

2.3.2、DLJDOrderConsumer2

package org.star.orderly.consumer;import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.common.message.MessageExt;
import org.star.constants.RocketMQConstant;import java.util.List;/*** @Author: 一叶浮萍归大海* @Date: 2023/8/25 16:23* @Description: 顺序消息消费者*/
@Slf4j
public class DLJDOrderConsumer2 {public static void main(String[] args) throws Exception {DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("DLJDOrderConsumerGroup");consumer.setNamesrvAddr(RocketMQConstant.NAME_SERVER_ADDR);consumer.subscribe("DLJDOrderTopic", "*");consumer.registerMessageListener(new MessageListenerOrderly() {@Overridepublic ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {if (CollectionUtils.isNotEmpty(list)) {list.forEach(e -> {log.info("我是消费者DLJDOrderConsumer2,当前线程:{},队列ID:{},收到消息:{}",Thread.currentThread().getName(),e.getQueueId(), StrUtil.utf8Str(e.getBody()));});}return ConsumeOrderlyStatus.SUCCESS;}});consumer.start();log.info("DLJDOrderConsumer2 start success");}}

2.4、DLJDOrderProducer

package org.star.orderly.producer;import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.star.constants.RocketMQConstant;import java.nio.charset.StandardCharsets;
import java.util.List;/*** @Author: 一叶浮萍归大海* @Date: 2023/8/25 16:14* @Description: 顺序消息生产者*/
@Slf4j
public class DLJDOrderProducer {public static void main(String[] args) throws Exception {DefaultMQProducer producer = new DefaultMQProducer("DLJDOrderProducerGroup");producer.setNamesrvAddr(RocketMQConstant.NAME_SERVER_ADDR);try {producer.start();// 模拟6笔订单for (Integer orderId = 1; orderId <= 6; orderId++) {// 每笔订单要发送3条消息,即:创建订单==》扣减库存==》增加积分for (int j = 0; j < 3; j++) {String data = "";switch (j % 3) {case 0:data = "创建订单,订单id:" + orderId;break;case 1:data = "扣减库存,订单id:" + orderId;break;case 2:data = "增加积分,订单id:" + orderId;break;}Message message = new Message("DLJDOrderTopic", "DLJDOrderTag", orderId.toString(), data.getBytes(StandardCharsets.UTF_8));producer.send(message, new MessageQueueSelector() {@Overridepublic MessageQueue select(List<MessageQueue> messageQueues, Message message, Object o) {int hashCode = message.getKeys().hashCode();int size = messageQueues.size();    // 队列的数量int index = hashCode % size;         // 队列的索引log.info("keys:{},hashCode:{},size:{},index:{},messageQueues:{}", message.getKeys(), hashCode, size, index, JSON.toJSONString(message));log.info("当前操作:{}", StrUtil.utf8Str(message.getBody()));return messageQueues.get(index);}}, orderId);}}log.info("DLJDOrderProducer start success");producer.shutdown();} catch (Exception e) {log.error("error:{}", e.getMessage());}}}

2.5、控制台打印

# 生产者端
22:03:41.819 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:1,hashCode:49,size:4,index:1,messageQueues:{"body":"5Yib5bu66K6i5Y2V77yM6K6i5Y2VaWTvvJox","delayTimeLevel":0,"flag":0,"keys":"1","properties":{"KEYS":"1","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:41.829 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:创建订单,订单id:1
22:03:43.235 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:1,hashCode:49,size:4,index:1,messageQueues:{"body":"5omj5YeP5bqT5a2Y77yM6K6i5Y2VaWTvvJox","delayTimeLevel":0,"flag":0,"keys":"1","properties":{"KEYS":"1","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.235 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:扣减库存,订单id:1
22:03:43.241 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:1,hashCode:49,size:4,index:1,messageQueues:{"body":"5aKe5Yqg56ev5YiG77yM6K6i5Y2VaWTvvJox","delayTimeLevel":0,"flag":0,"keys":"1","properties":{"KEYS":"1","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.241 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:增加积分,订单id:1
22:03:43.243 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:2,hashCode:50,size:4,index:2,messageQueues:{"body":"5Yib5bu66K6i5Y2V77yM6K6i5Y2VaWTvvJoy","delayTimeLevel":0,"flag":0,"keys":"2","properties":{"KEYS":"2","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.244 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:创建订单,订单id:2
22:03:43.247 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:2,hashCode:50,size:4,index:2,messageQueues:{"body":"5omj5YeP5bqT5a2Y77yM6K6i5Y2VaWTvvJoy","delayTimeLevel":0,"flag":0,"keys":"2","properties":{"KEYS":"2","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.247 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:扣减库存,订单id:2
22:03:43.250 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:2,hashCode:50,size:4,index:2,messageQueues:{"body":"5aKe5Yqg56ev5YiG77yM6K6i5Y2VaWTvvJoy","delayTimeLevel":0,"flag":0,"keys":"2","properties":{"KEYS":"2","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.250 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:增加积分,订单id:2
22:03:43.252 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:3,hashCode:51,size:4,index:3,messageQueues:{"body":"5Yib5bu66K6i5Y2V77yM6K6i5Y2VaWTvvJoz","delayTimeLevel":0,"flag":0,"keys":"3","properties":{"KEYS":"3","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.253 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:创建订单,订单id:3
22:03:43.256 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:3,hashCode:51,size:4,index:3,messageQueues:{"body":"5omj5YeP5bqT5a2Y77yM6K6i5Y2VaWTvvJoz","delayTimeLevel":0,"flag":0,"keys":"3","properties":{"KEYS":"3","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.256 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:扣减库存,订单id:3
22:03:43.259 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:3,hashCode:51,size:4,index:3,messageQueues:{"body":"5aKe5Yqg56ev5YiG77yM6K6i5Y2VaWTvvJoz","delayTimeLevel":0,"flag":0,"keys":"3","properties":{"KEYS":"3","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.259 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:增加积分,订单id:3
22:03:43.262 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:4,hashCode:52,size:4,index:0,messageQueues:{"body":"5Yib5bu66K6i5Y2V77yM6K6i5Y2VaWTvvJo0","delayTimeLevel":0,"flag":0,"keys":"4","properties":{"KEYS":"4","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.262 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:创建订单,订单id:4
22:03:43.266 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:4,hashCode:52,size:4,index:0,messageQueues:{"body":"5omj5YeP5bqT5a2Y77yM6K6i5Y2VaWTvvJo0","delayTimeLevel":0,"flag":0,"keys":"4","properties":{"KEYS":"4","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.266 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:扣减库存,订单id:4
22:03:43.269 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:4,hashCode:52,size:4,index:0,messageQueues:{"body":"5aKe5Yqg56ev5YiG77yM6K6i5Y2VaWTvvJo0","delayTimeLevel":0,"flag":0,"keys":"4","properties":{"KEYS":"4","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.270 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:增加积分,订单id:4
22:03:43.272 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:5,hashCode:53,size:4,index:1,messageQueues:{"body":"5Yib5bu66K6i5Y2V77yM6K6i5Y2VaWTvvJo1","delayTimeLevel":0,"flag":0,"keys":"5","properties":{"KEYS":"5","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.273 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:创建订单,订单id:5
22:03:43.275 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:5,hashCode:53,size:4,index:1,messageQueues:{"body":"5omj5YeP5bqT5a2Y77yM6K6i5Y2VaWTvvJo1","delayTimeLevel":0,"flag":0,"keys":"5","properties":{"KEYS":"5","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.275 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:扣减库存,订单id:5
22:03:43.277 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:5,hashCode:53,size:4,index:1,messageQueues:{"body":"5aKe5Yqg56ev5YiG77yM6K6i5Y2VaWTvvJo1","delayTimeLevel":0,"flag":0,"keys":"5","properties":{"KEYS":"5","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.277 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:增加积分,订单id:5
22:03:43.280 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:6,hashCode:54,size:4,index:2,messageQueues:{"body":"5Yib5bu66K6i5Y2V77yM6K6i5Y2VaWTvvJo2","delayTimeLevel":0,"flag":0,"keys":"6","properties":{"KEYS":"6","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.280 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:创建订单,订单id:6
22:03:43.284 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:6,hashCode:54,size:4,index:2,messageQueues:{"body":"5omj5YeP5bqT5a2Y77yM6K6i5Y2VaWTvvJo2","delayTimeLevel":0,"flag":0,"keys":"6","properties":{"KEYS":"6","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.284 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:扣减库存,订单id:6
22:03:43.288 [main] INFO org.star.orderly.producer.DLJDOrderProducer - keys:6,hashCode:54,size:4,index:2,messageQueues:{"body":"5aKe5Yqg56ev5YiG77yM6K6i5Y2VaWTvvJo2","delayTimeLevel":0,"flag":0,"keys":"6","properties":{"KEYS":"6","WAIT":"true","TAGS":"DLJDOrderTag"},"tags":"DLJDOrderTag","topic":"DLJDOrderTopic","waitStoreMsgOK":true}
22:03:43.288 [main] INFO org.star.orderly.producer.DLJDOrderProducer - 当前操作:增加积分,订单id:6
22:03:43.291 [main] INFO org.star.orderly.producer.DLJDOrderProducer - DLJDOrderProducer start success# 消费者1
22:03:43.237 [ConsumeMessageThread_12] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_12,队列ID:1,收到消息:创建订单,订单id:1
22:03:43.240 [ConsumeMessageThread_13] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_13,队列ID:1,收到消息:扣减库存,订单id:1
22:03:43.245 [ConsumeMessageThread_14] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_14,队列ID:1,收到消息:增加积分,订单id:1
22:03:43.266 [ConsumeMessageThread_15] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_15,队列ID:0,收到消息:创建订单,订单id:4
22:03:43.271 [ConsumeMessageThread_16] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_16,队列ID:0,收到消息:扣减库存,订单id:4
22:03:43.273 [ConsumeMessageThread_17] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_17,队列ID:0,收到消息:增加积分,订单id:4
22:03:43.277 [ConsumeMessageThread_18] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_18,队列ID:1,收到消息:创建订单,订单id:5
22:03:43.279 [ConsumeMessageThread_19] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_19,队列ID:1,收到消息:扣减库存,订单id:5
22:03:43.281 [ConsumeMessageThread_20] INFO org.star.orderly.consumer.DLJDOrderConsumer1 - 我是消费者DLJDOrderConsumer1,当前线程:ConsumeMessageThread_20,队列ID:1,收到消息:增加积分,订单id:5# 消费者2
22:03:43.272 [ConsumeMessageThread_2] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_2,队列ID:3,收到消息:创建订单,订单id:3
22:03:43.272 [ConsumeMessageThread_1] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_1,队列ID:2,收到消息:创建订单,订单id:2
22:03:43.275 [ConsumeMessageThread_1] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_1,队列ID:2,收到消息:扣减库存,订单id:2
22:03:43.275 [ConsumeMessageThread_2] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_2,队列ID:3,收到消息:扣减库存,订单id:3
22:03:43.275 [ConsumeMessageThread_1] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_1,队列ID:2,收到消息:增加积分,订单id:2
22:03:43.275 [ConsumeMessageThread_2] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_2,队列ID:3,收到消息:增加积分,订单id:3
22:03:43.287 [ConsumeMessageThread_3] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_3,队列ID:2,收到消息:创建订单,订单id:6
22:03:43.299 [ConsumeMessageThread_4] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_4,队列ID:2,收到消息:扣减库存,订单id:6
22:03:43.303 [ConsumeMessageThread_5] INFO org.star.orderly.consumer.DLJDOrderConsumer2 - 我是消费者DLJDOrderConsumer2,当前线程:ConsumeMessageThread_5,队列ID:2,收到消息:增加积分,订单id:6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

肖sir__linux详解__001

linux详解: 1、ifconfig 查看ip地址 2、6版本&#xff1a;防火墙的命令&#xff1a; service iptables status 查看防火墙状态 service iptables statrt 开启防火墙 service iptables stop 关闭防火墙 service iptables restart 重启防火墙状态 7版本&#xff1a; systemctl s…

考前冲刺上岸浙工商MBA的备考经验分享

2023年对于许多人来说都是不平凡的一年&#xff0c;历经三年的抗争&#xff0c;我们终于成功结束了疫情。而我也很幸运的被浙工商MBA项目录取&#xff0c;即将开始全新的学习生活。身为一名已在职工作6年的人&#xff0c;能够重回校园真是一种特别令人激动的体验。今天&#xf…

域内密码喷洒

在Kerberos阶段认证的AS-REQ阶段&#xff0c;请求包cname对应的值是用户名&#xff0c;当用户名存在时候&#xff0c;密码正确和错误两种情况下&#xff0c;AS-REP返回包不一样&#xff0c;所以可以利用这一点对域用户名进行密码喷洒攻击 域内密码喷洒工具 Kerbrute kerbrut…

【Redis】redis入门+java操作redis

目录 一、Redis入门 1.1 Redis简介 1.2 Redis下载与安装 1.2.1 下载 1.2.2 linux安装 1.2.3 windows安装 1.3 Redis服务启动与停止 1.3.1 linux启动、停止Redis服务 1.3.2 windows启动、停止Redis服务 1.4 修改Redis启动密码 1.4.1 Linux修改设置 1.4.2 windows设…

使用HTTPS模式建立高效爬虫IP服务器详细步骤

嘿&#xff0c;各位爬虫小伙伴们&#xff01;想要自己建立一个高效的爬虫IP服务器吗&#xff1f;今天我就来分享一个简单而强大的解决方案——使用HTTPS模式建立工具&#xff01;本文将为你提供详细的操作步骤和代码示例&#xff0c;让你快速上手&#xff0c;轻松建立自己的爬虫…

Scala并发编程的react、loop方法详解

Scala并发编程的react、loop方法详解 在 Scala 中编写并发应用程序&#xff0c;我们通常会使用 Actor 和 ActorSystem 来创建和管理 Actor&#xff0c;而 react 和 loop 方法则是 Actor 的两个重要方法。 1. react 方法&#xff1a; react 方法是 Actor 类中最基本的消息处理…

python爬虫13:pymysql库

python爬虫13&#xff1a;pymysql库 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产生…

国际站阿里云服务器多久会重启一次系统??

阿里云服务器是一种高性能、高可靠的云计算服务&#xff0c;但在长时间运行过程中&#xff0c;系统可能会出现一些问题&#xff0c;需要重启来恢复正常运行。那么&#xff0c;阿里云服务器多久重启一次系统呢&#xff1f;本文将对这个问题进行解答。 阿里云服务器重启频率 阿里…

【力扣每日一题】2023.8.29 带因子的二叉树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一些元素&#xff0c;让我们用这些元素连接形成特定的二叉树&#xff0c;每种元素可以使用任意次数&#xff0c;形成的二叉树要…

【云计算•云原生】5.云原生之初识DevOps

文章目录 1.DevOps背景2.DevOps概念3.DevOps工具链 1.DevOps背景 软件开发必须包含两个团队&#xff1a;开发团队和运维团队 开发团队负责开发项目&#xff0c;系统迭代更新运维团队负责项目测试以及部署上线&#xff0c;维持系统稳定运行 一个软件周期中是由这两个团队相互…

数据库备份

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 目录 数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 2.为student表和score表增加记录 3.备份数据库school到/backup目录 4.备份MySQL数据库为带…

全局异常处理

案例一&#xff1a; 自定义异常 public class StudentException extends RuntimeException {private Integer code;private String msg;public StudentException(Integer code, String msg) {this.code code;this.msg msg;}/*** 这里需要重写 getMessage方法&#xff0c;否…

Kubernetes技术--k8s核心技术Pod

(1).概述 Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型。 k8s不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成。 一个pod中的容器共享网络命名空间。 Pod是一个短暂存在的。 (2).为什么k8s中最小单元是…

Windows10上使用llama-recipes(LoRA)来对llama-2-7b做fine-tune

刚刚在Windows10上搭建环境来对llama2做finetune&#xff0c;里面坑还是挺多的&#xff0c;这里把印象中的坑整理了一下以作备忘。 llama-recipes是meta的开源项目&#xff0c;Github地址为&#xff1a;GitHub - facebookresearch/llama-recipes: Examples and recipes for Ll…

Go几种读取配置文件的方式

比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式&#xff0c;包括 JSON,TOML,YAML,HECL,envfile&#xff0c;甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper[2]按照这个优先级&#xff08;从高到低&am…

数据结构:时间复杂度和空间复杂度计算

1.什么是时间复杂度和空间复杂度&#xff1f; 1.1算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c; 而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间…

UE4 显示遮挡物体

SceneDepth是你相机能够看见的物体的深度距离 CustomDepth是你相机包括看不见被遮挡的物体的深度距离 如果CustemDepth比SceneDepth的距离相等&#xff0c;那么就是没有被遮挡的物体&#xff0c;如果被遮挡那么就是CustemDepth比SceneDepth深度距离远&#xff0c;然后再做对应…

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements Runnable{…

Win7下设置“定时关机”的方法

【Win7下设置定时关机的方法】 ●【所有程序】→【附件】→【系统工具】→【任务计划程序】 ● 右键单击&#xff0c;选择【创建基本任务】&#xff0c;然后在【任务名称】中填自定义名称&#xff0c;如“定时关机” ● 之后&#xff0c;按照下面各图的提示进行“任务触发器”…

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤 本教程详细介绍了如何在Ubuntu操作系统上安装CUDA&#xff08;NVIDIA的并行计算平台&#xff09;和cuDNN&#xff08;深度神经网络库&#xff09;&#xff0c;以及如何验证安装是否成功。通过按照这些步骤操作&#xff0c;您将能够…