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

Springboot整合WebFlux

一、使用WebFlux入门

  • WebFlux整合Mysql
  • WebFlux整合ES
  • WebFlus整合Mongdb
  • WebFlus整合Redis
1、添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.2.1.RELEASE</version>
</dependency>
<!-- 自动化配置响应式的 ES -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- 自动化配置响应式的 Mongodb -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<!-- 自动化配置响应式的 Spring Data Jedis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- 自动化配置响应式的 Spring Data R2DBC -->
<dependency><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-starter-data-r2dbc</artifactId><version>0.1.0.M2</version>
</dependency>
<!-- jasync 的 r2dbc-mysql 驱动 -->
<dependency><groupId>com.github.jasync-sql</groupId><artifactId>jasync-r2dbc-mysql</artifactId><version>1.0.11</version>
</dependency>
2、添加配置类
spring:data:elasticsearch: # Elasticsearch 配置项client:# 对应 ReactiveRestClientProperties 配置类reactive:endpoints: 127.0.0.1:9200 # ES Restful API 地址mongodb:authentication-database: admindatabase: testhost: 127.0.0.1password: m123port: 27017username: madmin
配置类
  • @EnableReactiveElasticsearchRepositories
  • @EnableMongoRepositories
  • @EnableTransactionManagement
@Configuration
@EnableReactiveElasticsearchRepositories 
@EnableMongoRepositories
@EnableTransactionManagement 
public class WebFluxConfiguration {//Redis的传输对象@Beanpublic ReactiveRedisTemplate<String, Object> commonRedisTemplate(ReactiveRedisConnectionFactory factory) {RedisSerializationContext<String, Object> serializationContext =RedisSerializationContext.<String, Object>newSerializationContext(RedisSerializer.string()).value(RedisSerializer.json()) // 创建通用的 GenericJackson2JsonRedisSerializer 作为序列化.build();return new ReactiveRedisTemplate<>(factory, serializationContext);}@Beanpublic ReactiveRedisTemplate<String, UserCacheObject> userRedisTemplate(ReactiveRedisConnectionFactory factory) {RedisSerializationContext<String, UserCacheObject> serializationContext =RedisSerializationContext.<String, UserCacheObject>newSerializationContext(RedisSerializer.string()).value(new Jackson2JsonRedisSerializer<>(UserCacheObject.class)) // 创建专属 UserCacheObject 的 Jackson2JsonRedisSerializer 作为序列化.build();return new ReactiveRedisTemplate<>(factory, serializationContext);}//数据库操作mysql数据库@Beanpublic ConnectionFactory connectionFactory(R2dbcProperties properties) throws URISyntaxException {// 从 R2dbcProperties 中,解析出 host、port、databaseURI uri = new URI(properties.getUrl());String host = uri.getHost();int port = uri.getPort();String database = uri.getPath().substring(1); // 去掉首位的 / 斜杠// 创建 jasync Configuration 配置配置对象com.github.jasync.sql.db.Configuration configuration = new com.github.jasync.sql.db.Configuration(properties.getUsername(), host, port, properties.getPassword(), database);// 创建 JasyncConnectionFactory 对象return  new JasyncConnectionFactory(new MySQLConnectionFactory(configuration));}//实物管理器@Beanpublic ReactiveTransactionManager transactionManager(R2dbcProperties properties) throws URISyntaxException {return new R2dbcTransactionManager(this.connectionFactory(properties));}}
4、Controller示例
@RestController
@RequestMapping("/users")
public class UserController {private static final UserDO USER_NULL = new UserDO();@Autowiredprivate UserRepository userRepository;@GetMapping("/list")public Flux<UserVO> list() {// 返回列表return userRepository.findAll().map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@GetMapping("/get")public Mono<UserVO> get(@RequestParam("id") Integer id) {// 返回return userRepository.findById(id).map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@PostMapping("add")public Mono<Integer> add(UserAddDTO addDTO) {// 查询用户Mono<UserDO> user = userRepository.findByUsername(addDTO.getUsername());// 执行插入return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {if (userDO != USER_NULL) {// 返回 -1 表示插入失败。// 实际上,一般是抛出 ServiceException 异常。因为这个示例项目里暂时没做全局异常的定义,所以暂时返回 -1 啦return Mono.just(-1);}// 将 addDTO 转成 UserDOuserDO = new UserDO().setId((int) (System.currentTimeMillis() / 1000)) // 使用当前时间戳的描述,作为 ID 。.setUsername(addDTO.getUsername()).setPassword(addDTO.getPassword()).setCreateTime(new Date());// 插入数据库return userRepository.insert(userDO).map(UserDO::getId);}});}}
4、Controller
@RestController
@RequestMapping("/users")
public class UserController {// ========== 使用通用的 ReactiveRedisTemplate 的方式 ==========@Autowiredprivate ReactiveRedisTemplate<String, Object> commonRedisTemplate;@Autowiredprivate ReactiveRedisTemplate<String, UserCacheObject> userRedisTemplate;@GetMapping("/get")public Mono<UserCacheObject> get(@RequestParam("id") Integer id) {String key = genKey(id);return commonRedisTemplate.opsForValue().get(key).map(o -> (UserCacheObject) o);}@PostMapping("/set")public Mono<Boolean> set(UserCacheObject user) {String key = genKey(user.getId());return commonRedisTemplate.opsForValue().set(key, user);}private static String genKey(Integer id) {return "user::" + id;}@GetMapping("/v2/get")public Mono<UserCacheObject> getV2(@RequestParam("id") Integer id) {String key = genKeyV2(id);return userRedisTemplate.opsForValue().get(key);}@PostMapping("/v2/set")public Mono<Boolean> setV2(UserCacheObject user) {String key = genKeyV2(user.getId());return userRedisTemplate.opsForValue().set(key, user);}//获取keyprivate static String genKeyV2(Integer id) {return "user::v2::" + id;}
}

6、Controller

@RestController
@RequestMapping("/users")
public class UserController {private static final UserDO USER_NULL = new UserDO();@Autowiredprivate UserRepository userRepository;/*** 查询用户列表*/@GetMapping("/list")public Flux<UserVO> list() {// 返回列表return userRepository.findAll().map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}/*** 获得指定用户编号的用户*/@GetMapping("/get")public Mono<UserVO> get(@RequestParam("id") Integer id) {// 返回return userRepository.findById(id).map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}/*** 添加用户*/@PostMapping("add")@Transactionalpublic Mono<Integer> add(UserAddDTO addDTO) {// 查询用户Mono<UserDO> user = userRepository.findByUsername(addDTO.getUsername());// 执行插入return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {if (userDO != USER_NULL) {// 返回 -1 表示插入失败。// 实际上,一般是抛出 ServiceException 异常。因为这个示例项目里暂时没做全局异常的定义,所以暂时返回 -1 啦return Mono.just(-1);}// 将 addDTO 转成 UserDOuserDO = new UserDO().setUsername(addDTO.getUsername()).setPassword(addDTO.getPassword()).setCreateTime(new Date());// 插入数据库return userRepository.save(userDO).flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {// 如果编号为偶数,抛出异常。if (userDO.getId() % 2 == 0) {throw new RuntimeException("我就是故意抛出一个异常,测试下事务回滚");}// 返回编号return Mono.just(userDO.getId());}});}});}/*** 更新指定用户编号的用户*/@PostMapping("/update")public Mono<Boolean> update(UserUpdateDTO updateDTO) {// 查询用户Mono<UserDO> user = userRepository.findById(updateDTO.getId());// 执行更新return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 查询用户是否存在return userRepository.findByUsername(updateDTO.getUsername()).defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<? extends Boolean>>() {@Overridepublic Mono<? extends Boolean> apply(UserDO usernameUserDO) {// 如果用户名已经使用(该用户名对应的 id 不是自己,说明就已经被使用了)if (usernameUserDO != USER_NULL && !Objects.equals(updateDTO.getId(), usernameUserDO.getId())) {return Mono.just(false);}// 执行更新userDO.setUsername(updateDTO.getUsername());userDO.setPassword(updateDTO.getPassword());return userRepository.save(userDO).map(userDO -> true); // 返回 true 成功}});}});}/*** 删除指定用户编号的用户*/@PostMapping("/delete") // URL 修改成 /delete ,RequestMethod 改成 DELETEpublic Mono<Boolean> delete(@RequestParam("id") Integer id) {// 查询用户Mono<UserDO> user = userRepository.findById(id);// 执行删除。这里仅仅是示例,项目中不要物理删除,而是标记删除return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 执行删除return userRepository.deleteById(id).map(aVoid -> true); // 返回 true 成功}});}}
3、配置类
@Configuration
public class UserRouter {@Beanpublic RouterFunction<ServerResponse> userListRouterFunction() {return RouterFunctions.route(RequestPredicates.GET("/users2/list"),new HandlerFunction<ServerResponse>() {@Overridepublic Mono<ServerResponse> handle(ServerRequest request) {// 查询列表List<UserVO> result = new ArrayList<>();result.add(new UserVO().setId(1).setUsername("yudaoyuanma"));// 返回列表return ServerResponse.ok().bodyValue(result);}});}@Beanpublic RouterFunction<ServerResponse> userGetRouterFunction() {return RouterFunctions.route(RequestPredicates.GET("/users2/get"),new HandlerFunction<ServerResponse>() {@Overridepublic Mono<ServerResponse> handle(ServerRequest request) {// 获得编号Integer id = request.queryParam("id").map(s -> StringUtils.isEmpty(s) ? null : Integer.valueOf(s)).get();// 查询用户UserVO user = new UserVO().setId(id).setUsername(UUID.randomUUID().toString());// 返回列表return ServerResponse.ok().bodyValue(user);}});}@Beanpublic RouterFunction<ServerResponse> demoRouterFunction() {return route(GET("/users2/demo"), request -> ok().bodyValue("demo"));}}
2、编写控制类
  1. 增删改查使用不同的请求方法Get,Post,Put,Delete实现,减少了Mapping寻址配置
  2. 返回单条数据使用Mono封装
  3. 返回集合数据使用Flux封装
@RestController
@RequestMapping(value = "/city")
public class CityWebFluxController {@Autowiredprivate CityHandler cityHandler;//查询单个数据@GetMapping(value = "/{id}")public Mono<City> findCityById(@PathVariable("id") Long id) {return cityHandler.findCityById(id);}//查询批量数据@GetMappingpublic Flux<City> findAllCity() {return cityHandler.findAllCity();}//保存@PostMappingpublic Mono<Long> saveCity(@RequestBody City city) {return cityHandler.save(city);}//更新@PutMappingpublic Mono<Long> modifyCity(@RequestBody City city) {return cityHandler.modifyCity(city);}//删除@DeleteMapping(value = "/{id}")public Mono<Long> deleteCity(@PathVariable("id") Long id) {return cityHandler.deleteCity(id);}
}
3、编写Handler类(类似于Serivce类)
  1. 这是一个业务类
  2. 使用JDK8的lambda表达式实现
@Component
public class CityHandler {private final CityRepository cityRepository;@Autowiredpublic CityHandler(CityRepository cityRepository) {this.cityRepository = cityRepository;}//新增public Mono<Long> save(City city) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.save(city)));}//修改public Mono<Long> modifyCity(City city) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.updateCity(city)));}//删除public Mono<Long> deleteCity(Long id) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.deleteCity(id)));}//查找public Mono<City> findCityById(Long id) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.findCityById(id)));}//查找public Flux<City> findAllCity() {return Flux.create(cityFluxSink -> {cityRepository.findAll().forEach(city -> cityFluxSink.next(city));cityFluxSink.complete();});}}

二、延伸使用

2、请求头解析
  • headers = “myheader=myvalue”
  • @RequestHeader(“myheader”)
  • @CookieValue(“tid”)
@GetMapping(path = "/filter/{name}", headers = "myheader=myvalue")
public Mono<String> headerFilter(@PathVariable(name = "name") String name) {return Mono.just("request filter: " + name);
}@GetMapping(path = "get")
public Mono<String> getHeader(@RequestHeader("myheader") String header,@RequestHeader("user-agent") String userAgent) {return Mono.just("request headers: myheader=" + header + " userAgent=" + userAgent);
}@GetMapping(path = "cookie")
public Mono<String> getCookie(@CookieValue("tid") String tid) {return Mono.just("request cookies tid=" + tid);
}
3、请求参数

https://spring.hhui.top/spring-blog/2020/08/27/200827-SpringBoot%E7%B3%BB%E5%88%97WebFlux%E4%B9%8BPath%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E4%B8%8Eurl%E6%98%A0%E5%B0%84/

  • @PathVariable(name = “index”)
@GetMapping(path = "/basic/{index}")
public Mono<String> basic(@PathVariable(name = "index") int index) {return Mono.just("path index: " + index);
}
4、访问静态资源

(1)配置静态资源未知

//1、通过注册方式
@SpringBootApplication
public class Application implements WebFluxConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/o2/");}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
//2通过路由设置方式
@Bean
public RouterFunction<ServerResponse> indexRouter(@Value("classpath:/index.html") final Resource indexHtml,@Value("classpath:/self/s.html") final Resource sHtml) {return RouterFunctions.route(RequestPredicates.GET("/index"),request -> ServerResponse.ok().contentType(MediaType.TEXT_HTML).bodyValue(indexHtml)).andRoute(RequestPredicates.GET("/s"),request -> ServerResponse.ok().contentType(MediaType.TEXT_HTML).bodyValue(sHtml));
}
6、ES响应控制类
@RestController
@RequestMapping("/users")
public class UserController {private static final UserDO USER_NULL = new UserDO();@Autowiredprivate UserRepository userRepository;@GetMapping("/list")public Flux<UserVO> list() {return userRepository.findAll().map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@GetMapping("/get")public Mono<UserVO> get(@RequestParam("id") Integer id) {// 返回return userRepository.findById(id).map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@PostMapping("add")public Mono<Integer> add(UserAddDTO addDTO) {Mono<UserDO> user = userRepository.findByUsername(addDTO.getUsername());return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {if (userDO != USER_NULL) {// 返回 -1 表示插入失败。// 实际上,一般是抛出 ServiceException 异常。因为这个示例项目里暂时没做全局异常的定义,所以暂时返回 -1 啦return Mono.just(-1);}// 将 addDTO 转成 UserDOuserDO = new UserDO().setId((int) (System.currentTimeMillis() / 1000)) // 使用当前时间戳的描述,作为 ID 。.setUsername(addDTO.getUsername()).setPassword(addDTO.getPassword()).setCreateTime(new Date());// 插入数据库return userRepository.save(userDO).map(UserDO::getId);}});}@PostMapping("/update")public Mono<Boolean> update(UserUpdateDTO updateDTO) {// 查询用户Mono<UserDO> user = userRepository.findById(updateDTO.getId());// 执行更新return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 查询用户是否存在return userRepository.findByUsername(updateDTO.getUsername()).defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<? extends Boolean>>() {@Overridepublic Mono<? extends Boolean> apply(UserDO usernameUserDO) {// 如果用户名已经使用(该用户名对应的 id 不是自己,说明就已经被使用了)if (usernameUserDO != USER_NULL && !Objects.equals(updateDTO.getId(), usernameUserDO.getId())) {return Mono.just(false);}// 执行更新userDO.setUsername(updateDTO.getUsername());userDO.setPassword(updateDTO.getPassword());return userRepository.save(userDO).map(userDO -> true); // 返回 true 成功}});}});}@PostMapping("/delete") // URL 修改成 /delete ,RequestMethod 改成 DELETEpublic Mono<Boolean> delete(@RequestParam("id") Integer id) {// 查询用户Mono<UserDO> user = userRepository.findById(id);// 执行删除。这里仅仅是示例,项目中不要物理删除,而是标记删除return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 执行删除return userRepository.deleteById(id).map(aVoid -> true); // 返回 true 成功}});}}

相关文章:

Springboot整合WebFlux

一、使用WebFlux入门 WebFlux整合MysqlWebFlux整合ESWebFlus整合MongdbWebFlus整合Redis 1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.2.1.…...

uniapp 实现地图距离计算

在uniapp中实现地图距离计算可以借助第三方地图服务API来实现。以下是一种基本的实现方式&#xff1a; 注册地图服务API账号&#xff1a;你可以选择使用高德地图、百度地图等提供地图服务的厂商&#xff0c;注册一个开发者账号并获取API密钥。 安装相关插件或SDK&#xff1a;根…...

破除“中台化”误区,两大新原则考核中后台

近年来&#xff0c;“中台化”已成为许多企业追求的目标&#xff0c;旨在通过打通前后台数据和业务流程&#xff0c;提升运营效率和创新能力。然而&#xff0c;在实施过程中&#xff0c;一些误解可能导致“中台化”未能如预期般发挥作用。本文将探讨这些误解&#xff0c;并提出…...

基于YOLOV8模型和Kitti数据集的人工智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型和Kitti数据集的人工智能驾驶目标检测系统可用于日常生活中检测与定位车辆、汽车等目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用…...

基于Android的课程教学互动系统 微信小程序uniapp

教学互动是学校针对学生必不可少的一个部分。在学校发展的整个过程中&#xff0c;教学互动担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类教学互动程序也在不断改进。本课题所设计的springboot基于Android的教学互动系统&#xff0c;使用SpringBoot框架&am…...

OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV不仅能够处理图像&#xff0c;还能够处理视频。视频是由大量的图像构成的&#xff0c;这些图像是以固定的时间间隔从视频中获取的。这样&#xff0c;就能够使用图像处理的方法对这些图像进行处理&#xff0c;进而达到…...

PostgreSQL命令行工具psql常用命令

1. 概述 通常情况下操作数据库使用图形化客户端工具&#xff0c;在实际工作中&#xff0c;生产环境是不允许直接连接数据库主机&#xff0c;只能在跳板机上登录到Linux服务器才能连接数据库服务器&#xff0c;此时就需要使用到命令行工具。psql是PostgreSQL中的一个命令行交互…...

【CSS 画个梯形】

使用clip-path: polygon画梯形 clip-path: polygon使用方式如下&#xff1a; 效果实现 clip-path: polygon 是CSS的属性之一&#xff0c;用于裁剪元素的形状。它可以通过定义一个具有多边形顶点坐标的值来创建一个多边形的裁剪区域&#xff0c;从而实现元素的非矩形裁剪效果。…...

Spring Data Redis

文章目录 Redis各种Java客户端Spring Data Redis使用方式操作字符串类型的数据操作哈希类型数据列表类型集合类型有序集合类型通用类型 Redis各种Java客户端 Java中如何操作redis&#xff0c;这里主讲IDEA中的框架Spring Data Redis来操作redis Jedis是官方推出的&#xff0c;…...

软件测试的方法有哪些?

软件测试 根据利用的被测对象信息的不同&#xff0c;可以将软件测试方法分为&#xff1a;黑盒测试、灰盒测试、白盒测试。 1、白盒测试 1&#xff09;概念&#xff1a;是依据被测软件分析程序内部构造&#xff0c;并根据内部构造分析用例&#xff0c;来对内部控制流程进行测试…...

Python Qt学习(二)Qt Designer

一开始以为Designer是个IDE&#xff0c;多番尝试之后&#xff0c;发现&#xff0c;是个UI设计工具&#xff0c;并不能在其中直接添加代码。保存之后&#xff0c;会生成一个后缀是UI的文件&#xff0c;再用pyuic5.exe将ui文件转化成py文件。pyuic5 -o 目标py文件 源ui文件...

我的数据上传类操作(以webDAV为例)

在登录处进行初始化&#xff1a; 1.读取配置 GModel.ServerSetin JsonToIni.GetClass<ServerSet>(ConfigFiles.ConfigFile);if (!string.IsNullOrWhiteSpace(GModel.ServerSetin.FTPUser)){OPCommon.NetControls.NetworkShareConnect.connectToShare(GModel.ServerSeti…...

move与函数指针的简单使用

std::move() C11的标准库 提供了一个非常有用的函数 std::move()&#xff0c;std::move() 函数将一个左值强制转化为右值引用&#xff0c;以用于移动语义。 就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝 #include <iostream&g…...

第五章 树与二叉树 二、二叉树的定义和常考考点

一、定义 二叉树可以用以下方式详细定义&#xff1a; 二叉树是由节点构成的树形结构&#xff0c;每个节点最多可以有两个子节点。每个节点有以下几个属性&#xff1a; 值&#xff1a;存储该节点的数据。左子节点&#xff1a;有一个左子节点&#xff0c;如果没有则为空。右子节…...

算法笔记/USACO Guide GOLD金组DP 1. Introduction to DP

USACO Guide中金组的内容分为一下六个章节 DP数学图论数据结构树一些附加主题 今天学习DP&#xff0c;以下内容&#xff1a; 初入DP背包DP图表中的路线最长递增序列状态压缩DP区间DP数位DP 初入DP Dynamic Programming (DP) is an important algorithmic technique in Comp…...

天锐绿盾安全U盘系统

安全U盘系统 01 简介 天锐绿盾安全U盘系统&#xff0c;是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等&#xff0c;天锐绿盾安全U盘系统为您U盘的数据保驾护航&#xff0…...

灰色预测模型

当谈论灰色预测时&#xff0c;通常是指灰色系统理论&#xff0c;它是一种用于处理少量数据或缺乏充分信息的情况下进行预测和分析的数学方法。灰色预测的核心思想是通过建立灰色模型来分析和预测数据的变化趋势。 我会解释灰色预测的基本原理、步骤和方法&#xff1a; 1. 灰色…...

Yolo系列-yolov1

YOLO-V1 经典的one-stage方法 YouOnlyLookOnce&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; 核心思想&#xff1a; Yolov1的核心思想是将对象…...

单片机TVS/ESD二极管防护

TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下&#xff0c;如果电压继续增大&#xff0c;将会引发雪崩&#xff0c;使得…...

TCP协议的重点知识点

TCP协议的重点知识点 TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,工作在传输层,提供可靠的字节流服务。它是互联网协议栈中最重要、最复杂的协议之一,也是面试中常被问到的知识点。本文将详细介绍TCP协议的各个重要概念。 TCP基本特性 TCP主要具有以下基本特性: …...

大数据——一文熟悉HBase

1、HBase是什么 HBase是基于HDFS的数据存储&#xff0c;它建立在HDFS文件系统上面&#xff0c;利用了HDFS的容错能力&#xff0c;内部还有哈希表并利用索引&#xff0c;可以快速对HDFS上的数据进行随时读写功能。 Hadoop在已经有一个HiveMapReduce结构的数据读写功能&#x…...

如何有效进行RLHF的数据标注?

编者按&#xff1a;随着大语言模型在自然语言处理领域的广泛应用&#xff0c;如何从人类反馈进行强化学习&#xff08;RLHF&#xff09;已成为一个重要的技术挑战。并且RLHF需要大量高质量的人工数据标注&#xff0c;这是一个非常费力的过程。 本文作者在数据标注领域具有丰富经…...

2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

windows配置wsl,Unbuntu启动GPU加速

wsl全称Windows Subsystem for Linux&#xff0c;windows电脑下的linux子系统&#xff0c;对于想用Linux的Windows用户来说wsl是一个不错的选择。 安装wsl 两种方法可以安装wsl&#xff0c;这个默认安装在C盘。 方法一运行命令安装 wsl --install方法二&#xff0c;在windo…...

Postman测WebSocket接口

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…...

【内网穿透】搭建我的世界Java版服务器,公网远程联机

目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统&#xff08;支持一键自动安装脚本&#xff09; 3.2 创建隧道映射内网端口 3.3 测试公网远程…...

Unable to Locate package python2| Linux Ubuntu系统下python2的安装

Linux Ubuntu系统下python2的安装 FSL的安装脚本是用Python2写的&#xff0c;新版本的Ubuntu &#xff08;16以后&#xff09;在默认情况下没有安装Python2。在终端输入 python2&#xff0c;若提示没有相应的命令&#xff0c;则需要先安装Python2&#xff0c;如下指令&#xf…...

从上帝视角俯瞰vue2路由(简单易懂)

文章目录 路由原理&#xff08;hash&#xff09;路由安装和使用&#xff08;vue2&#xff09;路由跳转路由的传参和取值嵌套路由路由守卫完整代码 路由原理&#xff08;hash&#xff09; 单页应用的路由模式有两种 哈希模式&#xff08;利用hashchange 事件监听 url的hash 的…...

STL-空间配置器的了解

前言 空间配置器&#xff0c;顾名思义就是为了各个容器高效的管理空间&#xff08;空间的申请与回收&#xff09;的&#xff0c;在默默的工作的。虽然在常规上使用STL时&#xff0c;可能用不上它&#xff0c;但是站在学习研究的角度&#xff0c;学习它的实现原理对我们有很大的…...

哔哩哔哩 B站 bilibili 视频视频音效调节 清澈人声

视频音效调节方式&#xff1a;直接视频播放内容界面内鼠标右键点击视频音效调节 注意&#xff1a;需要使用的是谷歌浏览器&#xff0c;我的火狐浏览器试了不行&#xff0c;都没选项&#xff0c;火狐的出来的界面是这样的&#xff1a; 目录 具体操作如下&#xff1a; 1、谷歌…...

专业的seo网站优化公司/江苏seo网络

【单选题】以下程序的输出结果是:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬ def hub(ss, x 2.0,y 4.0): ss x * y ss 10 print(ss, hub(ss, 3…...

使用云主机做网站教程/网站优化网站优化

SpringMVC_requestMapping 项目搭建见上篇《初识 Spring(09)---(搭建SpringMVC项目&#xff09;》 1.requestMapping既可以用在方法上&#xff0c;也可以用在类上 文件目录&#xff1a; 代码&#xff1a;新建SpringmvcTest.java package com.neuedu.springmvc.controller;i…...

湘潭自适应网站建设 磐石网络/哪些平台可以发布推广信息

2.5.1. EnableConfigurationProperties 引用自定义 *.properties 配置文件 Application.java 涮锅配置NetkillerProperties.java是 ComponentScan 扫描范围&#xff0c;可以不用声明下面注解。 EnableConfigurationProperties(NetkillerProperties.class)import org.springfram…...

廊坊做网站电话/seo关键词优化外包

问题描述&#xff1a;父组件传如lesser和larger两个参数&#xff0c;并且是ajax从服务器获取的。子组件定义created阶段输出lesser和larger。但larger为空。改成延迟输出则正确。问题来源&#xff1a;https://segmentfault.com/q/1010000008912491提问者的主要问题是没有搞清楚…...

大型网站故障/吉林seo基础知识

Elasticsearch的删除也是很灵活的&#xff0c;下次我再介绍&#xff0c;DeleteByQuery的方式。今天就先介绍一个根据ID删除。上代码。 package com.sojson.core.elasticsearch.manager; import org.elasticsearch.action.delete.DeleteResponse; import com.sojson.common.mo…...

艺友网站建设/北京官网优化公司

降级策略RT是平均响应时间策略 设置RT的响应时间单位毫秒&#xff0c;RT最大值为4900毫秒&#xff0c;需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rtxxx来配置 需要使用到jmeter测试工具&#xff0c;jmeter下载页面 下载zip包即可 解压后修改配置文件b…...