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

分布式架构与XXL-JOB

目录

先了解什么是任务调度?

什么是分布式任务调度?

了解XXL-JOB分布式任务调度平台  

如何搭建XXL-JOB?

分片广播

作业分片方案


最近学习在项目的媒资管理模块如何高效处理大量视频,上传单个视频可能涉及到转码,内容审核等多个处理部分

如果采用传统的单线程处理模式可能会导致资源利用率低下,所有操作依次排队会导致执行处理视频耗时较长,效率不高的问题出现

因此,在处理大量视频文件时,我们需要学习更高效的任务处理方式,如何高效满足这些视频处理需求?

1.采用多线程

  • 在处理大量视频任务时,单线程处理效率较低,无法充分利用系统资源。为了提高处理效率可以采用多线程技术来并发处理任务

核心思想是:将一个任务拆分为多个子任务,并发执行这些子任务,充分利用CPU和内存资源,提高任务处理效率

2.采用分布式架构+多线程

  • 通过分布式架构和多线程技术的结合,最大化利用计算资源,高效处理大规模任务,例如我们所说的处理大量视频文件

采用分布式+线程可扩展性更强,同时它也是一种 分布式任务调度 的处理方案

先了解什么是任务调度?

任务调度:顾名思义就是对任务的调度,它是指系统为了完成特定的业务,基于给定的时间点,给定的时间间隔或者给定执行次数自动执行任务

我们思考一下下面业务场景

  • 某财务系统需要在每天上午10点结算前一天的账单数据,统计汇总
  • 12306网站会根据车次不同,设置几个时间点分批放票
  • 商品成功发货后,需要向客户发送短信提醒

以上这些场景,就是 任务调度 所需要解决的问题,类似场景还有很多,我们该如何实现?这里我举例三种实现方法

1.多线程方式实现

回顾多线程思想,当我们可以开启一个线程,每sleep一段时间,就去检查是否已经到预期执行时间

简单实现任务调度的功能(按一定的间隔时间执行任务调度的功能):

public static void main(String[] args){//任务执行时间间隔final long timeInterval = 1000;Runnable runnable = new Runnable()}{public void run(){while(true){//TODO:somethingtry{Thread.sleep(timeInterval);}catch(InterruptedException e){e.printStackTrace(); } }}};Thread thread = new Thread(runnable); thread.start();  }
}

2.Timer 和 ScheduledExecutor(JDK提供的相关支持是用于定时任务调度的工具类,帮助我们在指定的时间点或周期性的执行任务

Timer的核心功能:

  • 单次任务:在指定的延迟后执行一次任务
  • 周期性任务:以固定的时间间隔重复执行任务

Timer的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行

Timer方法的实现:

public static void main(String[] args){Timer timer = new Timer();timer.schedule(new TimerTask(){@Overridepublic void run(){//TODO:someting  }},1000,2000); //一秒开始调度,每2秒执行一次}

ScheduledExecutor方式实现:

public static void main(String [] args){//创建一个固定大小为10的线程池,用于执行定时任务(线程池中的线程可以并发执行多个任务)ScheduledExecutorService service = Executors.newScheduledThreadPool(10);service.scheduleAtFixedRate(new Runnable(){@Override//任务逻辑是打印“todo something”public void run(){//TODO:somethingSystem.out.print("todo something");}//任务将在一秒后首次执行,之后,任务以每2秒执行一次},1,2,TimeUnit.SECONDS);
}
scheduleAtFixedRate:

是用于以固定的速率调度任务,任务会在指定的初始延迟后开始执行,之后以固定的时间间隔重复执行

基于线程池设计的ScheduledExecutor,其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因为任务是并发执行的,相互之间不会受到打扰

Timer和ScheduledExecutor都仅能提供基于开始时间与重复间隔的任务调度,不能胜任更加复杂的调度需求 — 比如,设置每月第一天凌晨1点执行任务,复杂调度任务的管理,任务间传递数据等等

3.再学习另一个功能强大的 任务调度框架Quartz,它可以满足更多更复杂的调度需求,Quartz设计的核心类包括Scheduler,Job以及Trigger,其中,Job负责定义需要执行的任务,Trigger负责设置调度策略,Scheduler将两者组装起来,并触发任务开始执行,Quartz支持简单的按时间间隔调度,还支持按日历调度方式,通过设置CronTrigger表达式(包括:秒,分,时,日,月,周,年)进行任务调度

public static void main(String [] agrs) throws SchedulerException {//创建一个SchedulerSchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();//创建JobDetailJobBuilder jobDetailBuilder = JobBuilder.newJob(MyJob.class);jobDetailBuilder.withIdentity("jobName","jobGroupName");JobDetail jobDetail = jobDetailBuilder.build();//创建触发的CronTrigger 支持按日历调度CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroupName").startNow().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();scheduler.scheduleJob(jobDetail,trigger);scheduler.start();
}public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext){System.out.println("todo something");}
}

通过以上内容学习了什么是任务调度,任务调度所解决的问题,以及任务调度的多种实现方式

什么是分布式任务调度?


   通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度,如下图:

分布式调度要实现的目标:

不管是任务调度程序集成在应用程序中,还是单独构建的任务调度系统,如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力

1.并行任务调度

并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的

如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。

2、高可用

若某一个实例宕机,不影响其他实例来执行任务。

3、弹性扩容

当集群中增加实例就可以提高并执行任务的处理效率。

4、任务管理与监测

对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。

5、避免任务重复执行

当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。

了解XXL-JOB分布式任务调度平台  

XXL-JOB是一个 轻量级分布式任务调度平台,专门解决分布式系统中的定时任务调度问题,其核心设计目标是开发迅速、学习简单、轻量级、易扩展

官网:https://www.xuxueli.com/xxl-job/

XXL-JOB(如图所示)主要有调度中心,执行器,任务:

1.调度中心(XXL-JOB Admin):

调度中心是XXL-JOB的核心管理平台,负责对任务进行统一的管理和调度,它提供了一个可视化的Web界面,方便开发者进行任务的配置,监控和管理 

2.执行器(XXL-JOB Executor)

执行器是实际执行任务的组件,它负责接收调度中心发送的任务请求,并执行具体的业务逻辑,执行器可以部署在多个节点上,实现分布式任务执行

3.任务

负责执行具体的业务逻辑

调度中心与执行器之间的工作流程如下:

执行流程:

1.任务执行器根据配置的调度中心的地址,自动注册到调度中心

2.达到任务触发条件,调度中心下发任务

3.执行器基于线程池执行任务,并将执行结果放到内存队列中,把执行日志写入日志文件中

4.执行器消费内存队列中的执行结果,主动上报给调度中心

5.当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情 

如何搭建XXL-JOB?

首先需要下载XXL-JOB,可以从GitHub地址或者Gitee地址进行下载

GitHub 地址

  • 仓库地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)

Gitee 地址

  • 仓库地址:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

如何集成XXL-JOB?我在我的媒资管理模块项目中进行演示

1.当下载好后,用IDEA打开目录显示界面如下

其中的 xxl-job-admin为调度中心,xxl-job-core为公共依赖,xxl-job-executor-samples为执行器(推荐使用Springboot版本,通过Springboot管理执行器)

2.再创建一个命名为xxl_job_2.3.1的数据库

CREATE DATABASE xxl_job_2.3.1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

根据数据库脚本创建数据库,修改数据库连接信息和端口,启动xxl-job-admin,访问http://local:18088/xxl-job-admin/(分布式任务调度平台 — 管理和调度分布式环境中的定时任务)

使用用户名:admin / 密码:123456 登录

下面配置执行器,执行器负责与调度中心通信接收调度中心发起的任务调度请求

1.进入调度中心添加执行器

启动成功之后,可以选择在Linux上运行

使用maven命令,将xxl-job-admin打包,然后将其上传至Linux中,使用命令启动

nohup java -jar /绝对路径/xxl-job-admin-2.3.1.jar &

添加完执行器后,接着配置执行器,执行器负责与调度中心通信,接收调度中心发起的任务调度请求

1.首先在media-service工程中添加依赖(父工程中完成了版本控制,这里的版本是2.3.1)

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId>
</dependency>

2.在nacos下的media-service-dev.yaml下配置xxl-job

注意这里配置的appname是执行器的应用名,稍后会在调度中心配置执行器的时候使用

xxl:job:admin:addresses: http://192.168.101.128:18088/xxl-job-admin/executor:appname: media-process-serviceaddress:ip:port: 9999logpath: /data/applogs/xxl-job-jobhandlerlogretentiondays: 30accessToken: default_token

3.配置xxl-job的执行器

将xxl-job-executor-sample-springboot示例工程下的配置类拷贝到媒资管理的service工程下:

该类中的属性就是获取配置文件中的配置得到的,同时提供了一个执行器的Bean,用于初始化XXL-JOB执行器的核心组件XxIJobSpringExecutor

并将其注册为Spring Bean,使得执行器能够连接到XXL-JOB管理平台并接收任务调度请求

@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}/*** 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;**      1、引入依赖:*          <dependency>*             <groupId>org.springframework.cloud</groupId>*             <artifactId>spring-cloud-commons</artifactId>*             <version>${version}</version>*         </dependency>**      2、配置文件,或者容器启动变量*          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'**      3、获取IP*          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/}

再次进入调度中心,添加执行器

重启媒资管理服务模块,就可以看到执行器在调度中心注册成功

下面我们编写任务演示如何使用,在media-service下新建包com.project.media.service.jobhandler,在该包下定义我们的任务类

package com.xuecheng.media.service.jobhandler;import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** @description 测试执行器* @author Mr.M* @date 2022/9/13 20:32* @version 1.0*/@Component@Slf4j
public class SampleJob {/*** 1、简单任务示例(Bean模式)*/@XxlJob("testJob")public void testJob() throws Exception {log.info("开始执行.....");}}

然后进入调度中心添加任务,进入任务管理,新增任务信息

调度类型:固定速度指按固定的间隔定时调度

Cron:通过Cron表达式实现更丰富的定时调度策略,它的表达式是一个字符串,通过它可以定义调度策略,格式如下:

{秒数}{分数}{小时}{日期}{月份}{星期}{年份(可为空)}

比如:

30 10 1**?表示每天1点10分30秒触发

0/30****? 每30秒触发一次

* 0/10***?每10分钟触发一次

添加成功,启动任务

下面启动媒资管理的service工程,启动执行器并观察执行器方法的执行

掌握了xxL-Job的基本使用,继续思考如何进行分布式任务处理?比如说我们会启动多个执行器组成一个集群,去执行任务

结合以上XXL-JOB的实现,我们可以利用 分片广播策略 来提高处理效率尤其是处理数据库中大量数据(比如项目中媒资管理模块需要处理大量视频文件)

分片广播

分片广播是分布式任务调度中一种常见模式,主要用于将一个大任务拆分成多个子任务(分片),并将这些子任务 并发分发 到多个执行器节点上执行,从而提高任务处理效率

以上图示是 调度中心以执行器为维度进行分片,将集群中的执行器标上序号:0,1,2,3....,广播是指每次调度会向集群中的所有执行器发送任务调度,请求中携带分片参数,每个执行器收到调度请求同时接收分片参数

像这种分片广播适用于哪些场景?

分片任务场景:10个执行器的集群来处理10w条数据(数据之多),每台机器只需要处理1w条数据(分片执行),耗时降低10倍;

广播任务场景:广播执行器同时运行shell脚本,广播集群节点进行缓存更新等

"分片广播" 和普通任务开发流程一致,不同之处在于可以获取分片参数进行分片业务处理。

 测试分片广播策略

1.定义作业分片的任务方法

/***分片广播任务*/@XxlJob("shardingJobHandler")public void shardingJobHandler() throws Exception{//分片参数int shardIndex = XxlJobHelper.getShardIndex();int shardTotal = XxlJobHelper.getShardTotal();Log.info("分片参数:当前分片序号 = {},总分片数 = {}",shardIndex,shardTotal);
}

2.在调度中心添加任务

回到任务调度界面,可以看到该项任务添加成功

3.启动任务,观察日志

下面需要启动两个执行器实例,观察每个实例的执行情况

1.首先在nacos中配置media-service的本地优先部署

#配置本地优先
spring:cloud:config:override-none: true

2.将media-service启动两个实例,两个实例在启动时端口不能冲突

例如:在VM options处添加:-Dserver.port=63051 - Dxxl.job.executor.port=9998

在VM options处添加: -Dserver.port=63050 - Dxxl.job.executor.port=9999

3.启动两个实例,观察任务调度中心,稍等片刻执行器会有两个

分别观察这两个执行实例的日志

日志一:

日志二:

从日志可以看到每个实例的分片序号不同,如果其中一个执行器挂掉,只剩下一个执行器在工作,稍等片刻调用中心发现少了一个执行器将动态调整总分片数为1

作业分片方案

以上任务添加成功后,对于要处理的任务会添加到待处理任务表中,现在启动多个执行器实例去查询这些待处理任务,如何保证多个执行器不会查询到重复的任务呢?

XXL-JOB并不直接提供数据处理的功能,它只会给执行器分配好分片序号,在向执行器任务调度的同时下发分片总数以及分片序号等这些参数,执行器收到这些参数后根据自己的业务需求去利用这些参数

下图表示了多个执行器获取视频处理任务的结构:

每个执行器收到广播任务会有两个参数:分片总数,分片序号

每次执行从数据表取任务时可以让任务id 模上(取模运算) 分片总数,如果等于分片 序号则能执行此任务

假设我们有6个待处理的视频任务,任务ID依次为1-6,同时有3个执行器实例,那么分片总数就是3,对应的分片序号则为0,1,2。具体任务分配情况如下:

任务序号任务 ID  分片总数(求模运算)应执行的执行器分片序号
11 % 3 = 1执行器 2
22 % 3 = 2执行器 3
33 % 3 = 0执行器 1
44 % 3 = 1执行器 2
55 % 3 = 2执行器 3
66 % 3 = 0执行器 1

从上述表格中可以清晰地看到,每个任务都根据其任务ID的取模结果被精准地分配到了对应的执行器上,而不会出现多个执行器获取到同一个任务的情况

通过这种XXL-JOB的分片机制,可以用于处理视频转码,视频审核,视频分发等任务,将大量视频处理任务均匀分配给多个执行器,保证任务的高效执行和不会重复处理

相关文章:

分布式架构与XXL-JOB

目录 先了解什么是任务调度&#xff1f; 什么是分布式任务调度&#xff1f; 了解XXL-JOB分布式任务调度平台 如何搭建XXL-JOB&#xff1f; 分片广播 作业分片方案 最近学习在项目的媒资管理模块如何高效处理大量视频&#xff0c;上传单个视频可能涉及到转码&#xff0c…...

6121A 音频分析仪

6121A 音频分析仪 音频信号产生 音频信号分析 国产 6121A是具有音频信号产生和音频信号分析功能的测试仪器&#xff0c;适用于语音性能测试和音频功放测试等领域&#xff0c;满足电台、移动通信、音响设备和水声通信设备对频响、谐波失真和信噪比等指标的测试需求&#xff…...

什么是幂等性?

一.幂等性 什么是幂等性&#xff1f; 在计算机科学和数学领域中&#xff0c;” 幂等性 “虽然源于相同的概念&#xff0c;但其应用和具体含义有所不同 在数学中&#xff1a;幂等性是一个代数性质&#xff0c;描述的是一个操作或函数在多次应用后结果不变的特性 在分布式系统…...

2025/2/19机试准备

1.%c不忽略空格&#xff08; &#xff09; 2.启示 #include <stdio.h> #include <string.h> int main(){char str[100]{0};int x,y;int n1,n2,n3;int i;while(scanf("%s",str)!EOF){istrlen(str);if(i%30){//12446-2n1i/3;n3i/3;n2i/32;}else if(i%31){…...

【wrk】wrk 压测工具入门

1. 简介 wrk 是我无意间发现的一款简单好用的 HTTP 接口性能测试工具&#xff0c;目前在 Github 上已经有 38k 的 star 数了&#xff01; ⭐ Github地址&#xff1a;https://github.com/wg/wrk 2. 安装 环境要求&#xff1a; windows10 平台安装过 ubuntu 等 Linux 子系统 …...

12.1 Android中协程的基本使用

文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念&#xff0c;只知道协程能够使得异步操作等同于同步操作&#xff0c;且不会…...

华为 eNSP:MSTP

一、MSTP是什么 MSTP是多业务传送平台&#xff08;Multi-Service Transport Platform&#xff09;的缩写&#xff0c;它是一种基于SDH&#xff08;同步数字体系&#xff09;技术的传输网络技术&#xff0c;用于同时实现TDM、ATM、以太网等多种业务的接入、处理和传送。 MSTP技…...

HMSC联合物种分布模型在群落生态学中的贝叶斯统计分析应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...

LangChain大模型应用开发:消息管理与聊天历史存储

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天要给大家分享的是LangChain中的消息管理与聊天历史存储。 在LangChain里&#xff0c;消息管理可精细区分用户、助手、系统等不同角色消息&#xff0c;有序调度处理&#xff0c;让交互更顺畅。而聊天历史存储则赋予模型 …...

flink-cdc同步数据到doris中

1 创建数据库和表 1.1 数据库脚本 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 flnk-cdc 参考Flink CDC实时同步MySQL到Doris Flink CDC 概述 2.1.1 最简单的单表同步 从下面的yml脚本可以看到&#xff0c;并没有doris中创建…...

轻量级在线ETL数据集成工具架构设计与技术实现深度剖析

在当今数字化时代,企业面临着海量异构数据的整合挑战。ETL(Extract, Transform, Load)工具作为数据集成的核心,负责将分散在不同数据源中的数据进行抽取、转换和加载,以构建统一的数据视图。本文将深入剖析一款基于诺依框架开发的在线ETL数据集成工具,重点阐述其架构设计…...

【Linux专栏】find命令+同步 实验

Linux & Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.实验背景 需要把一个目录中所有文件,按照目录把某个时间点之前的同步到一个盘中,之后的同步备份到另一个盘中,实现不同时间段的备份。 本次实现目标:把common文件夹中 2025年之后的含文件夹…...

15-最后一个单词的长度

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 方法一&#xff1a;使用字符串分割 可以使用字符串的 split 方法将字符串按空格分割…...

DeepSeek和ChatGPT的全面对比

一、模型基础架构对比&#xff08;2023技术版本&#xff09; 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...

LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装

LlamaFactory https://llamafactory.readthedocs.io/zh-cn/latest/ 安装 必须保证版本匹配&#xff0c;否则到训练时&#xff0c;找不到gpu cuda。 否则需要重装。下面图片仅供参考。因为cuda12.8装了没法用&#xff0c;重新搞12.6 cudacudnnpytorch12.69.612.6最新&#xf…...

什么是网关,网关的作用是什么?网络安全零基础入门到精通实战教程!

1. 什么是网关 网关又称网间连接器、协议转换器&#xff0c;也就是网段(局域网、广域网)关卡&#xff0c;不同网段中的主机不能直接通信&#xff0c;需要通过关卡才能进行互访&#xff0c;比如IP地址为192.168.31.9(子网掩码&#xff1a;255.255.255.0)和192.168.7.13(子网掩码…...

Linux基础25-C语言之分支结构Ⅱ【入门级】

用if语句实现分支结构 单分支&#xff1a;if… 语法&#xff1a; //语法1&#xff1a;舍弃{} if(条件表达式);单语句; //语法2&#xff1a;必须保留{} if(条件表达式) {单语句或者复合语句; }流程图 功能 若表达式值为真&#xff08;非0&#xff09;&#xff0c;则执行表达式…...

实战开发coze应用-姓氏头像生成器(上)

​欢迎关注【AI技术开发者】 上次&#xff0c;我们开发了一个对话形式的头像生成器智能体&#xff08;Agents&#xff09;&#xff0c;广受大家欢迎。 同时也接收到一些用户的反馈&#xff0c;生成前无法看到头像样式、初次使用不会用等等。 对此&#xff0c;我准备使用Coze开…...

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体&#xff0c;企业内部知识库通过结构化的信息聚合与动态化的知识流动&#xff0c;为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心&#xff0c;依托数据加密技术构建多层级访问控制机制&#xff0c;确保敏感信…...

uniapp 滚动尺

scale组件代码&#xff08;部分class样式使用到了uview1.0的样式&#xff09; <template><view><view class"scale"><view class"pointer u-flex-col u-col-center"><u-icon name"arrow-down-fill" size"26&qu…...

vue3之echarts3D圆柱

vue3之echarts3D圆柱 效果&#xff1a; 版本 "echarts": "^5.1.2" 核心代码&#xff1a; <template><div ref"charts" class"charts"></div><svg><linearGradient id"labColor" x1"0&q…...

SQL 优化工具使用之 explain 详解

一、导读 对于大部分开发人员来说&#xff0c;平常接触的无非就是增删改查这些基本操作&#xff0c;创建存储过程&#xff0c;视图等等都是 DBA 该干的活&#xff0c;但是想要把这些基本操作写的近乎完美也是一件难事。 而 explain 显示了 MySQL 如何使用索引来处理 select 语…...

SpringBoot启动失败之application.yml缩进没写好

修改前&#xff1a; spring前面空格了 报错输出&#xff1a;Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…...

基于SpringBoot+vue粮油商城小程序系统

粮油商城小程序为用户提供方便快捷的在线购物体验&#xff0c;包括大米、面粉、食用油、调味品等各种粮油产品的选购&#xff0c;用户可以浏览商品详情、对比价格、下单支付等操作。同时&#xff0c;商城还提供优惠活动、积分兑换等福利&#xff0c;让用户享受到更多实惠和便利…...

【JavaEE进阶】Spring MVC(3)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 返回响应 返回静态页面 //RestController Controller RequestMapping("/response") public class ResponseController {RequestMapping("/returnHtmlPage&…...

案例-17.文件上传-阿里云OSS-入门

一.文件上传 我们在OSS页面中找到SDK下载&#xff0c;点击SDK示例&#xff0c;找到帮助文档。 点击JAVA并安装 在安装SDK中找到在Maven项目中加入依赖项(推荐方式) 将其中的依赖复制到pom文件中去。 <dependency><groupId>com.aliyun.oss</groupId><ar…...

java数据结构_优先级队列(堆)_6.2

3. 常用接口 3.1 PriorityQueue的特性 Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列&#xff0c;PriorityQueue的线性不安全的&#xff0c;PriorityBlockingQueue是线程安全的&#xff0c;这里主要介绍PriorityQueueu。 关于PriorityQueue…...

如何维护和保养直线模组?

直线模组是一种常见的传动机构&#xff0c;被广泛应用到各种各样的设备中&#xff0c;如激光焊接、激光切割、涂胶机、喷涂机、小型数控机床等设备。其保养与维护对于其使用寿命和性能至关重要&#xff0c;为了维护和保养直线模组并确保其使用寿命&#xff0c;可以采取以下措施…...

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

java连接redis

1.使用 1.创建java工程 2.引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version> </dependency> 3. //1.获取jedis对象&#xff0c;把所有对redis的操作都封装到…...

DeepSeek掀起推理服务器新风暴,AI应用迎来变革转折点?

AI 浪潮下&#xff0c;推理服务器崭露头角 在科技飞速发展的当下&#xff0c;AI 是耀眼明星&#xff0c;席卷各行业&#xff0c;深刻改变生活与工作模式&#xff0c;从语音助手到医疗诊断、金融风险预测&#xff0c;AI 无处不在。其发展分数据收集整理、模型训练、推理应用三个…...

宏块划分的原理

宏块划分并不是物理上的划分,而是逻辑上的划分。 宏块的划分是编码器在处理视频帧时的一种逻辑操作,用于将视频帧分解为更小的编码单元,以便后续的预测、变换、量化和编码等操作。视频帧的物理存储方式(如 YUV 数据的存储顺序)并不会因为宏块的划分而发生改变。 接下来,…...

分享8款AI生成PPT的工具!含测评

随着人工智能技术的飞速进步&#xff0c;制作PPT变得愈发便捷&#xff0c;仅需输入主题指令&#xff0c;便能在瞬间获得一份完整的演示文稿。尤其在制作篇幅较长的PPT时&#xff0c;手动编写每一页内容并设计格式和排版&#xff0c;不仅效率低下&#xff0c;而且耗时耗力。 本…...

【NLP算法面经】字节跳动算法岗四面详细面经(★附面题总结★)

【NLP算法面经】字节跳动算法岗四面详细面经&#xff08;★附面题总结★&#xff09; &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 NLP Github 项目推荐&#xff1a; 【AI 藏经阁】&#…...

[AI相关]Unity的C#代码如何简写

是一个某培训机构的飞行棋教学源码 不知道&#xff0c;是否有人想知道怎么可以简写 &#xff08;这个问AI&#xff0c;DeepSeek也应该找不到答案的&#xff09; 静态变量 属性引用 单例 注入 一些UnityEvent特性就不说了。。。 IL 注入 运算符号改写...

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技术飞速发展的今天&#xff0c;深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型&#xff0c;凭借其高效的性能和灵活的部署方式&#xff0c;受到了广泛关注。无论是自然语言处理、图像识别&#xff0c;还是…...

TaskBuilder创建客户信息文件夹

数据模型创建好之后&#xff0c;我们就可以进行前后端功能的开发了。首先&#xff0c;我们需要创建好客户信息文件夹&#xff0c;以便专门存放与客户信息管理有关的前端文件&#xff0c;操作步骤如下&#xff1a; 点击销售管理示例项目“前端文件”右侧的加号按钮&#xff1a; …...

javaSE学习笔记22-线程(thread)-线程通信、线程池

线程通信 应用场景&#xff1a;生产者和消费者问题 假设仓库中只能存放一件产品&#xff0c;生产者将生产出来的产品放入仓库&#xff0c;消费者将仓库中产品取走消费 如果仓库中没有产品&#xff0c;则生产者将产品放入仓库&#xff0c;否则停止生产并等待&#xff0c…...

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题 前言问题描述问题原因尝试过的命令及分析解决方案&#xff1a;修改 wsl.conf 禁用自动生成总结 前言 在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系统时&#xff0c;你可能会遇到 /etc/resolv.conf 文件被自动重…...

使用mybatis -基本的增删改查

目录 项目准备 项目步骤 具体细节 1 主配置文件的处理 2 Test 测试类 3 在 loginMapper 接口中书写 对 数据库操作的方法 4 实体类 pojo 、entity 要和 数据库对应的表的字段 一一对应 5 在 loginMapper.xml 映射文件 书写 具体实现 loginMapper 接口中方法的sql 语句…...

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考&#xff08;windows 部署安装 大模型 DeepSeek-R1&#xff09; 那么实际使用中需要开启API模式&#xff0c;这样可以无拘无束地通过API集成的方式&#xff0c;集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…...

模型量化初始知识

背景 PyTorch对量化的支持目前有如下三种方式&#xff1a; Post Training Dynamic Quantization&#xff0c;模型训练完毕后的动态量化&#xff1b; Post Training Static Quantization&#xff0c;模型训练完毕后的静态量化&#xff1b; QAT&#xff08;Quantization Aware T…...

成熟开发者需具备的能力

精业务 • 指深入理解和熟悉所开发软件的业务逻辑和需求。 • 开发者需要明确软件要解决的问题、面向的用户群体以及核心功能等。 • 精业务有助于开发者更好地设计系统架构、编写符合业务需求的代码&#xff0c;并能根据业务变化灵活调整开发计划。 懂原理 • 指掌握编程的基…...

java练习(32)

ps&#xff1a;题目来自力扣 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表…...

linux配置网络安全服务图

系统安全防范&#xff1a; 1&#xff1a;用户与口令安全。避免使用脆弱口令&#xff0c;连续多次登录失败将禁止再次登录。 2&#xff1a;对象访问的安全性。对文件&#xff0c;目录和进程等对象的访问采用强制访问控制&#xff08;MAC&#xff09;来实现&#xff0c;不同的用…...

PTA:使用指针方式求一个给定的m×n矩阵各行元素之和

本题要求编写程序&#xff0c;使用指针方式求一个给定的mn矩阵各行元素之和。&#xff08;例如&#xff1a;scanf("%d", *(matrix i) j); // 使用指针方式访问二维数组元素&#xff09; 输入格式: 输入第一行给出两个正整数m和n&#xff08;1<m<6, 1<n&…...

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…...

【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库

DeepSeek R1模型的Linux服务器搭建、API访问及Web页面搭建 1&#xff0c;引言2&#xff0c;安装Ollama工具3&#xff0c;下载DeepSeek R1 模型4&#xff0c;DeepSeek命令行对话5&#xff0c;DeepSeek API接口远程调用6&#xff0c;DeepSeek结合Web-ui实现图形化界面远程访问6.1…...

利用多线程加速ESMC-6B模型API调用以及403Forbidden问题的解决

前言 只对之前这篇文章进行了补充 403 Forbidden问题的解决 这几天用了一下ESMC-6B的API&#xff0c;发现被403 forbidden了 排查问题查来查去&#xff0c;发现需要翻墙才可以访问&#xff08;怎么又被针对了&#xff09; 于是就需要在服务器上面接入VPN&#xff0c;想了想…...

zyNo.25

SSRF漏洞 在了解ssrf漏洞前先了解curl命令的使用 1.curl命令的使用 基本格式&#xff1a;curl<参数值>请求地址 get请求&#xff1a;curl http://127.0.0.1 post请求&#xff1a;curl -X POST -d "a1&b2" http://127.0.0.1/(其中&#xff0c;使用-X参…...