RabbitMQ如何保证发送的消息可靠(RabbitMQ的Confirm模式和2.Return模式)

RabbitMQ如何保证发送的消息可靠(RabbitMQ的Confirm模式和2.Return模式)

  • 1、RabbitMQ消息Confirm模式(保证从生产者到交换机的消息可靠)
    • 1.1、Confirm模式简介
    • 1.2、具体代码实现
      • 1.2.1、application.yml 开启确认模式
      • 1.2.2、生产者
        • 方式1:实现RabbitTemplate.ConfirmCallback
        • 生产者发送消息
        • 方式2:直接写在生产者发送消息类,实现RabbitTemplate.ConfirmCallback
        • 方式3:匿名内部类写法
        • 方式4:lambda表达式写法
      • 1.2.3、RabbitConfig做交换机和队列的绑定
      • 1.2.4、pom.xml配置文件
      • 1.2.5、测试
  • 2、RabbitMQ消息Return模式(保证从交换机的到队列的消息可靠)
    • 2.1、具体代码实现
      • 2.1.1、applicaton.yml
      • 2.1.2、pom.xml
      • 2.1.3、启动类
      • 2.1.4、业务层
      • 方式1:实现RabbitTemplate.ReturnsCallback
        • 回调类MyReturnCallback
        • 配置类
        • service业务层
      • 方式2:MessageService类实现RabbitTemplate.ReturnsCallback
      • 方式3:匿名内部类实现RabbitTemplate.ReturnsCallback
      • 方式4:lambda表达式实现RabbitTemplate.ReturnsCallback
      • 2.1.5、测试

1、RabbitMQ消息Confirm模式(保证从生产者到交换机的消息可靠)

1.1、Confirm模式简介

消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,exchange交换机会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker的exchange中,这也是消息可靠性投递的重要保障。
在这里插入图片描述

1.2、具体代码实现

1 配置文件application.yml 开启确认模式:spring.rabbitmq.publisher-confirm-type=correlated
2 写一个类实现RabbitTemplate.ConfirmCallback,判断成功和失败的ack结果,可以根据具体的结果,如果ack为false,对消息进行重新发送或记录日志等处理;
设置rabbitTemplate的确认回调方法
3 rabbitTemplate.setConfirmCallback(messageConfirmCallBack);

在这里插入图片描述

1.2.1、application.yml 开启确认模式

server:port: 8080
spring:application:name: confirm-test01rabbitmq:host: 你的服务器IPport: 5672username: 你的账号password: 你的密码virtual-host: powerpublisher-confirm-type: correlated #开启生产者的确认模式,设置关联模式my:exchangeName: exchange.confirm.01queueName: queue.confirm.01

1.2.2、生产者

方式1:实现RabbitTemplate.ConfirmCallback

单独写一个类,实现RabbitTemplate.ConfirmCallback

package com.power.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class MyConfirmCallback implements RabbitTemplate.ConfirmCallback {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if(ack){log.info("消息正确到达交换机");return;}//ack为false,消息没有到达交换机log.error("消息没有到达交换机,原因是:{}",cause);}
}
生产者发送消息
package com.power.service;import com.power.config.MyConfirmCallback;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@Resourceprivate MyConfirmCallback confirmCallback;@PostConstruct//构造方法后执行,相当于初始化作用public void init(){rabbitTemplate.setConfirmCallback(confirmCallback);}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();CorrelationData correlationData = new CorrelationData();//关联数据correlationData.setId("order_123456");//发送订单信息rabbitTemplate.convertAndSend("exchange.confirm.01","info",message,correlationData);log.info("消息发送完毕,发送时间是:{}",new Date());}
}
方式2:直接写在生产者发送消息类,实现RabbitTemplate.ConfirmCallback
package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService implements RabbitTemplate.ConfirmCallback {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstruct//构造方法后执行,相当于初始化作用public void init(){rabbitTemplate.setConfirmCallback(this);}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();CorrelationData correlationData = new CorrelationData();//关联数据correlationData.setId("order_123456");//发送订单信息rabbitTemplate.convertAndSend("exchange.confirm.01","info",message,correlationData);log.info("消息发送完毕,发送时间是:{}",new Date());}@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if(ack){log.info("消息正确到达交换机");return;}//ack为false,消息没有到达交换机log.error("消息没有到达交换机,原因是:{}",cause);}
}
方式3:匿名内部类写法

在这里插入图片描述

package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstruct//构造方法后执行,相当于初始化作用public void init(){rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if(ack){log.info("消息正确到达交换机");return;}//ack为false,消息没有到达交换机log.error("消息没有到达交换机,原因是:{}",cause);}});}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();CorrelationData correlationData = new CorrelationData();//关联数据correlationData.setId("order_123456");//发送订单信息rabbitTemplate.convertAndSend("exchange.confirm.01","info",message,correlationData);log.info("消息发送完毕,发送时间是:{}",new Date());}}
方式4:lambda表达式写法

在这里插入图片描述

package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstruct//构造方法后执行,相当于初始化作用public void init(){rabbitTemplate.setConfirmCallback(//lambda表达式写法(correlationData, ack, cause)->{log.info("关联id:{}",correlationData.getId());if(ack){log.info("消息正确到达交换机");return;}//ack为false,消息没有到达交换机log.error("消息没有到达交换机,原因是:{}",cause);});}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();CorrelationData correlationData = new CorrelationData();//关联数据correlationData.setId("order_123456");//发送订单信息rabbitTemplate.convertAndSend("exchange.confirm.03","info",message,correlationData);log.info("消息发送完毕,发送时间是:{}",new Date());}}

1.2.3、RabbitConfig做交换机和队列的绑定

package com.power.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {@Value("${my.exchangeName}")private String exchangeName;@Value("${my.queueName}")private String queueName;//创建直连交换机@Beanpublic DirectExchange directExchange(){return ExchangeBuilder.directExchange(exchangeName).build();}//创建队列@Beanpublic Queue queue(){return QueueBuilder.durable(queueName).build();}//交换机绑定队列@Beanpublic Binding binding(DirectExchange exchangeName,Queue queueName){return BindingBuilder.bind(queueName).to(exchangeName).with("info");}
}

1.2.4、pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.power</groupId><artifactId>rabbit_08_confirm01</artifactId><version>1.0-SNAPSHOT</version><name>rabbit_08_confirm01</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

1.2.5、测试

如果没有任何异常,消息会正常发送到交换机

在这里插入图片描述
如果程序存在异常,消息不会正常发送到交换机,如果当交换机的名字不对时,消息不会正常到底交换机的。

在这里插入图片描述

2、RabbitMQ消息Return模式(保证从交换机的到队列的消息可靠)

rabbitmq 整个消息投递的路径为:
producer —> exchange —> queue —> consumer

  • 消息从 producer 到 exchange 则会返回一个 confirmCallback;
  • 消息从 exchange –> queue 投递失败则会返回一个 returnCallback

我们可以利用这两个callback控制消息的可靠性投递;

开启 确认模式;
使用rabbitTemplate.setConfirmCallback设置回调函数,当消息发送到exchange后回调confirm方法。在方法中判断ack,如果为true,则发送成功,如果为false,则发送失败,需要处理;

注意配置文件中,开启 退回模式;

spring.rabbitmq.publisher-returns: true

在这里插入图片描述
使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到queue失败后,则会将消息退回给producer,并执行回调函数returnedMessage;

2.1、具体代码实现

在这里插入图片描述

2.1.1、applicaton.yml

server:port: 8080
spring:application:name: return-test01rabbitmq:host: 你的服务器IPport: 5672username: 你的账号password: 你的密码virtual-host: powerpublisher-returns: true #开启return模式my:exchangeName: exchange.return.01queueName: queue.return.01

2.1.2、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.power</groupId><artifactId>rabbit_09_return01</artifactId><version>1.0-SNAPSHOT</version><name>rabbit_09_return01</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.1.3、启动类

package com.power;import com.power.service.MessageService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.Resource;@SpringBootApplication
public class Application implements ApplicationRunner {@Resourceprivate MessageService messageService;public static void main(String[] args) {SpringApplication.run(Application.class);}@Overridepublic void run(ApplicationArguments args) throws Exception {messageService.sendMsg();}
}

2.1.4、业务层

方式1:实现RabbitTemplate.ReturnsCallback

回调类MyReturnCallback
package com.power.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;/*** 外部类* 写一个类实现一个接口*/
@Component
@Slf4j
public class MyReturnCallback implements RabbitTemplate.ReturnsCallback {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.error("消息从交换机没有正确的投递到队列,原因是:{}",returnedMessage.getReplyText());}
}
配置类
package com.power.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {@Value("${my.exchangeName}")private String exchangeName;@Value("${my.queueName}")private String queueName;//创建直连交换机@Beanpublic DirectExchange directExchange(){return ExchangeBuilder.directExchange(exchangeName).build();}//创建队列@Beanpublic Queue queue(){return QueueBuilder.durable(queueName).build();}//交换机绑定队列@Beanpublic Binding binding(DirectExchange directExchange,Queue queue){return BindingBuilder.bind(queue).to(directExchange).with("info");}
}
service业务层
package com.power.service;import com.power.config.MyReturnCallback;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@Resourceprivate MyReturnCallback myReturnCallback;@PostConstructpublic void init(){rabbitTemplate.setReturnsCallback(myReturnCallback);//设置回调}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();rabbitTemplate.convertAndSend("exchange.return.01","info111",message);log.info("消息发送完毕,发送时间是:{}",new Date());}
}

方式2:MessageService类实现RabbitTemplate.ReturnsCallback

package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService  implements RabbitTemplate.ReturnsCallback {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init(){rabbitTemplate.setReturnsCallback(this);//设置回调}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();rabbitTemplate.convertAndSend("exchange.return.01","info111",message);log.info("消息发送完毕,发送时间是:{}",new Date());}@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.error("消息从交换机没有正确的投递到队列,原因是:{}",returnedMessage.getReplyText());}
}

方式3:匿名内部类实现RabbitTemplate.ReturnsCallback

package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init(){rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returned) {log.error("消息从交换机没有正确的投递到队列,原因是:{}",returned.getReplyText());}});}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();rabbitTemplate.convertAndSend("exchange.return.01","info111",message);log.info("消息发送完毕,发送时间是:{}",new Date());}}

核心代码:
在这里插入图片描述

方式4:lambda表达式实现RabbitTemplate.ReturnsCallback

package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init(){rabbitTemplate.setReturnsCallback(returned-> {log.error("消息从交换机没有正确的投递到队列,原因是:{}",returned.getReplyText());});}@Beanpublic void sendMsg(){Message message = MessageBuilder.withBody("hello world".getBytes()).build();rabbitTemplate.convertAndSend("exchange.return.04","info111",message);log.info("消息发送完毕,发送时间是:{}",new Date());}}

核心

在这里插入图片描述

2.1.5、测试

启动程序,当消息从交换机 没有正确地 到达队列,则会触发该方法。

在这里插入图片描述
启动程序,如果消息从交换机 正确地 到达队列了,那么就不会触发该方法。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

讲讲分布式事务?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲分布式事务&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲分布式事务&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在现代的分布式系统中&#xff0c;数据往往分布在不同的服务器、数据中…

【职场日常】软件测试平台如何搭建?

作为一名软件测试工程师&#xff0c;搭建测试环境是我们日常工作的一部分。搭建一个适合各类测试的测试环境至关重要&#xff0c;可以在后期的测试过程中为我们提供便利。接下来我将向大家介绍如何搭建测试环境&#xff0c;以及需要注意的事项。 首先&#xff0c;我们需要确保…

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo&#xff0c;有网友留言如下图&#xff1a; 针对网友的留言&#xff0c;那么我们如何解决这个问题呢 Spring-Boot应用停机时&#xff0c;如何保证其内存消息都处理完成&#xff1f; 2.解决方法 方法其实挺简单的&…

3D一览通更新三大功能更新,进一步提升协同效率

大腾智能3D一览通新功能正式发布&#xff01;本次新版本在通用功能的基础上&#xff0c;新增并优化了3大功能点&#xff0c;为用户带来更加流畅、高效的使用体验&#xff0c;提升设计协同效率。 功能点1&#xff1a;在结构树中管理测量标注对象 在新版本中&#xff0c;我们将…

基于DCT的数字水印算法

摘要 数字水印技术近年来得到了较大的发展&#xff0c;基于变换域的水印技术是目前研究的热点。数字水印是利用数字作品中普遍存在的冗余数据和随机性&#xff0c;把标识版权的水印信息嵌入到数字作品中&#xff0c;从而可以起到保护数字作品的版权或其完整性的一种技术。 一个…

JAVA——反射

目录 1.概述 2.Class类 a.实例化对象 1.利用Class类的静态方法 2. 利用类名 3.利用类的成员方法 b.常见方法 1.获取所有公共构造方法对象的数组 2.获取所有构造方法对象数组 3.获取单个公共构造方法对象 4.获取单个构造方法对象 5.获取所有公共成员变量对象的数组 …

CMDB模型管理:构筑高效IT运维的坚实基础

在CMDB中&#xff0c;模型是一个非常重要的概念&#xff0c;在前面的文章中我们提到了模型对于保障CMDB数据准确性的重要性。那么&#xff0c;要如何理解CMDB的模型呢&#xff1f;模型在CMDB中又是什么地位&#xff1f;能起到什么作用呢&#xff1f; 一、模型概述 在CMDB中&…

一个月调研分析标的“英伟达”

放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今&#xff0c;若选一只股票长期持有&#xff0c;最佳解是 ARM&#xff08;涨了 20 倍&#xff09;&#xff0c;因为无论系统层和应用层谁胜出&#xff0c;底层一定是芯片&#xff0c;而…

实现金蝶和简道云仓库数据的高效集成

实现金蝶和简道云仓库数据的高效集成 金蝶-仓库--->简道云-仓库&#xff1a;高效数据集成方案 在企业信息化管理中&#xff0c;数据的高效流转和实时监控是提升业务效率的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将金蝶云星空…

Redis - Hash 哈希

一、基本认识 ⼏乎所有的主流编程语⾔都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数 组、映射。在Redis中&#xff0c;哈希类型是指值本⾝⼜是⼀个键值对结构&#xff0c;形如key"key"&#xff0c;value{{ field1, v…

基于python的简单web服务器示例

安装flask flask 简介&#xff1a;是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发&#xff0c;他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目 新建项目 创建好的效果 pip list 检索 安装…

职场日常:多年的测试工程师如何继续在测试行业中砥砺前行

大家好&#xff0c;今天我们一起聊聊测试工程师在职业、在团队、在家庭中如何更好的做好角色。 作为一个工作了多年测试工作的大牛来说&#xff0c;从今天开始或许未来会因为各个方面的原因可能不在从事软件测试了&#xff0c;但是会继续总结过往的经验&#xff0c;从事这么多…

【图神经网络】 AM-GCN代码实战(4)【pytorch】代码可运行

AM-GCN 网络系列 代码实践部分1. dataprocess.py1.1 模块导入1.2 特征文件生成1.3 KNN构图 2. configparser.py3. layers.py4. models.py5. utils.py6. main.py总结 代码实践部分 本专栏致力于深入探讨图神经网络模型相关的学术论文&#xff0c;并通过具体的编程实验来深化理解…

「Mac畅玩鸿蒙与硬件25」UI互动应用篇2 - 计时器应用实现

本篇将带领你实现一个实用的计时器应用&#xff0c;用户可以启动、暂停或重置计时器。该项目将涉及时间控制、状态管理以及按钮交互&#xff0c;是掌握鸿蒙应用开发的重要步骤。 关键词 UI互动应用时间控制状态管理用户交互 一、功能说明 在这个计时器应用中&#xff0c;用户…

条件logistic回归原理及案例分析

前面介绍的二元、多分类、有序Logistic回归都属于非条件Logistic回归&#xff0c;每个个案均是相互独立关系。在实际研究中&#xff0c;还有另外一种情况&#xff0c;即个案间存在配对关系&#xff0c;比如医学研究中配对设计的病例对照研究&#xff0c;此时违反了个案相互独立…

LeetCode:1.两数之和——Java 暴力解法哈希表

目录 题目如下&#xff1a; ​编辑 方法一&#xff1a;暴力解法 方法二&#xff1a;哈希表解法 题目如下&#xff1a; 1. 两数之和https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 tar…

微信商家转账到零钱新玩法,却是个不好接受的消息

大家好&#xff0c;我是小悟。 深耕微信生态的小伙伴都知道&#xff0c;微信这个转账的功能&#xff0c;从一开始的“企业付款到零钱”出了有几个版本了吧。不过不管怎么变&#xff0c;基本都是通过openid就可以直接转账给指定用户。 为提高商户服务效率和体验&#xff0c;防…

C语言使用stream完成协议封送

开发过程中&#xff0c;对于自定义协议的打包&#xff0c;可以借助stream完成。 stream.h #pragma once#include <stdio.h> #include <string.h>typedef struct stream {char d[256];size_t size;size_t len;size_t pos; } stream, *pstream;void stem_init(pstr…

Window 安装ack 搜索软件 及使用

1. 先安装 PowerShell 命令行工具 2. 通过该工具安装命令行包管理器工具 Chocolatey 命令&#xff1a; Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor …

基于SSM的社区物业管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…