Canal1.1.5整Springboot在MQ模式和TCP模式监听mysql

canal本实验使用的是1.1.5,自行决定版本:[https://github.com/alibaba/canal/releases]

canal 涉及的几个角色

  • canal-admin:canal 后台管理系统,管理 canal 服务
  • canal-deployer:即canal-server(客户端)
  • canal-instance: canal-server 中的一个处理实例(本质上不是一个实体jar服务)
  • mysql

image-20240402141720884

Mysql 开启 binlog

  • 查看开启状态
#修改 mysql启动配置
vim /etc/my.cnf#添加binlog配置
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1000 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复#重启mysql
restart mysqld

安装 canal-admin

  1. 下载canal-admin,解压

  2. 修改配置文件 canal-admin/conf/application.yml

    server:port: 8090  #canal-admin控制台访问端口
    spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8# admin控制台数据库
    spring.datasource:address: 127.0.0.1:3306database: canal_managerusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=falsehikari:maximum-pool-size: 30minimum-idle: 1# canal-deployer连接admin的访问账号,这里密码为明问。canal-deployer中为密文
    canal:adminUser: adminadminPasswd: 123456
    
  3. canal-admin 所需canal_manager数据库初始化

    sql文件位置: canal-admin/conf/canal_manager.sql

  4. 启动

    sh bin/startup.sh
    

访问控制台

http://127.0.0.1:8090

输入初始化默认账号密码 admin / 123456 进入系统,登录后可以在账号管理中修改密码。

image-20240402142749057

安装 canal-deployer

  1. 下载解压canal-deployer

  2. 修改配置文件

    删除canal.properties,重命名canal_local.properties为canal.properties

    # register ip 本服务在admin中的显示ip,名称也是用这个
    canal.register.ip = 127.0.0.1# canal admin config
    #canal-admin的访问地址
    canal.admin.manager = 127.0.0.1:8090  # canal-deployer的控制端口
    canal.admin.port = 11110 # canal-admin的访问账号
    canal.admin.user = admin # canal-admin的访问密码,与adminPasswd对应,这里是密文
    canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 # admin auto register 集群配置
    # 启动后自动注册到admin中
    canal.admin.register.auto = true
    # 集群名称 ,这里是单点可空着即可
    canal.admin.register.cluster = 
    # 节点名称名称,里是单点可空着即可
    canal.admin.register.name = 
    
  3. 启动 canal-deployer

# 启动服务 
bin/startup.sh # 查看启动日志
tailf logs/canal/canal.log
  • 刷新 admin 列表

image-20240402144329532

  • server 配置,这里默认使用 tcp 方式【不修改,端口就用默认11111】,后续改为mq模式
#################################################
######### 		common argument		#############
#################################################
# 使用tcp方式绑定的本地ip,mq方式不用填下
canal.ip =
# 注册到zk的本地ip,集群方式不用填写
canal.register.ip =
# tcp端口
canal.port = 11111 
# 监控信息拉取端口
canal.metrics.pull.port = 11112
# canal instance user/passwd,实例的访问账号密码
# canal.user = canal
# canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458# canal-admin连接配置,
# adminserver启动时使用本地配置,连上admin后,会统一使用admin的统一配置。
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =
canal.admin.register.name =# zk 集群zk的配置
canal.zkServers =
# 数据刷新到zk的频率,ms
canal.zookeeper.flush.period = 1000
# 是否关闭netty
canal.withoutNetty = false
# 数据推送模式 tcp, kafka, rocketMQ, rabbitMQ 
canal.serverMode = rabbitMQ
# 文件数据目录
canal.file.data.dir = ${canal.conf.dir}
# 文件数据刷新时间,ms
canal.file.flush.period = 1000
## 缓存的数据最大条数,必须为2的倍数
canal.instance.memory.buffer.size = 16384
## 每条数据的大小,byte。
canal.instance.memory.buffer.memunit = 1024 
## 缓存模式 
# MEMSIZE :按内存大小,限制为size*memunit
# ITEMSIZE:按条数,没有大小限制,可能出现内存溢出。
canal.instance.memory.batch.mode = MEMSIZE
# 是否开启raw数据传输模式,即json格式,关闭则使用byte模式
canal.instance.memory.rawEntry = true## 心跳检查
# 是否开启心跳检查
canal.instance.detecting.enable = false
# 心跳sql
#canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
canal.instance.detecting.sql = select 1
# 心跳频率
canal.instance.detecting.interval.time = 3
# 失败重试次数
canal.instance.detecting.retry.threshold = 3
# 是否开启失败切换mysql,需要配置standby数据库
canal.instance.detecting.heartbeatHaEnable = false# 并发处理事务数,超过数量将分为多个事物提交
canal.instance.transaction.size =  1024
# mysql主备切换时,binlog监控需要回退的时间,防止切换导致的数据不同步
canal.instance.fallbackIntervalInSeconds = 60## 网络配置
# 数据发送缓冲区,byte
canal.instance.network.receiveBufferSize = 16384
# 数据接受缓冲区,byte
canal.instance.network.sendBufferSize = 16384
# 获取数据的超时时间,秒
canal.instance.network.soTimeout = 10# binlog 过滤配置
# 是否使用druid解析ddl
canal.instance.filter.druid.ddl = true
# 是否忽略dcl语句,权限相关
canal.instance.filter.query.dcl = true
# 是否忽略dml语句,数据操作
canal.instance.filter.query.dml = false
# 是否忽略ddl语句,表操作
canal.instance.filter.query.ddl = true
# 是否忽略table异常,用于排查table异常情况
canal.instance.filter.table.error = false
# 是否忽略dml的数据变动,如update/insert/update操作
canal.instance.filter.rows = false
# 忽略数据库事务的相关事件,如在写入kafka时,忽略TransactionBegin/Transactionend事件,
canal.instance.filter.transaction.entry = false
# 是否忽略dml的insert操作
canal.instance.filter.dml.insert = false
# 是否忽略dml的update操作
canal.instance.filter.dml.update = false
# 是否忽略dml的delete操作
canal.instance.filter.dml.delete = false# 支持的binlog文件格式
canal.instance.binlog.format = ROW,STATEMENT,MIXED
# 支持的binlog记录格式 
canal.instance.binlog.image = FULL,MINIMAL,NOBLOB# ddl语句是否单独处理,防止语句内有无序并发处理导致数据不一致。
canal.instance.get.ddl.isolation = false# 并行处理配置
# 是否开启并行处理binlog
canal.instance.parser.parallel = true
# 并发线程数,理论上不要超过可用处理器数
# 默认Runtime.getRuntime().availableProcessors()。
#canal.instance.parser.parallelThreadSize = 16
## 并行处理的缓冲区大小,kb 必须2的幂次方
canal.instance.parser.parallelBufferSize = 256# 是否开启table mate 的tsdb功能,时序数据库
canal.instance.tsdb.enable = true
# 存储修改table mate的记录文件,默认使用h2数据库
canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal
# 快照存储间隔,小时
canal.instance.tsdb.snapshot.interval = 24
# 快照过期时间,小时
canal.instance.tsdb.snapshot.expire = 360#################################################
######### 		destinations		#############
#################################################
# 当前server中的实例列表
canal.destinations = 
# canal 配置文件目录
canal.conf.dir = ../conf
# 是否开启自动扫描,添加启动和删除停止实例
canal.auto.scan = true
# 自动扫描间隔时间,秒
canal.auto.scan.interval = 5# 当没有在binlog中找到位点,是否自动跳到最新的
# 警告:不确定逻辑时,还是不要开启。
canal.auto.reset.latest.pos.mode = false# tsdb配置路径,在canal.conf.dir路径下
canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml# 全局配置加载方式
# manager: canal-admin控制台配置
# spring: 本地文件加载
canal.instance.global.mode = manager
# 是否开启lazy懒加载
canal.instance.global.lazy = false
# 管理配置的加载地址
canal.instance.global.manager.address = ${canal.admin.manager}
# 全局配置文件,当mode为Spring时使用,file单机模式,default集群模式,memory内存模式
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/file-instance.xml
#canal.instance.global.spring.xml = classpath:spring/default-instance.xml# mq相关配置参考每个mq的处理模式,这里不单独说明
##################################################
######### 	      MQ Properties      #############
##################################################
# aliyun ak/sk , support rds/mq
canal.aliyun.accessKey =
canal.aliyun.secretKey =
canal.aliyun.uid=canal.mq.flatMessage = true
canal.mq.canalBatchSize = 50
canal.mq.canalGetTimeout = 100
# Set this value to "cloud", if you want open message trace feature in aliyun.
canal.mq.accessChannel = localcanal.mq.database.hash = true
canal.mq.send.thread.size = 30
canal.mq.build.thread.size = 8##################################################
######### 		     Kafka 		     #############
##################################################
# MQ地址
kafka.bootstrap.servers = 127.0.0.1:6667
# ack方式
# all:所有kafka节点同步完成返回,最慢
# 1: kafka主节点持久化后返回,一般快,
# 0: 发送后即返回,最快
kafka.acks = all
# 数据是否压缩
kafka.compression.type = none
# 每次发送消息的数据包大小,byte
kafka.batch.size = 16384
# 每次发送消息的间隔时间,ms
kafka.linger.ms = 1
# 最大请求大小,byte
kafka.max.request.size = 1048576
# 消息缓存大小
kafka.buffer.memory = 33554432
# 每个链接最大请求数
kafka.max.in.flight.requests.per.connection = 1
# 消息重试次数
kafka.retries = 0#kafka的kerberos 认证,开启需要配置2个认证文件
kafka.kerberos.enable = false
kafka.kerberos.krb5.file = "../conf/kerberos/krb5.conf"
kafka.kerberos.jaas.file = "../conf/kerberos/jaas.conf"##################################################
######### 		    RocketMQ	     #############
##################################################
rocketmq.producer.group = test
rocketmq.enable.message.trace = false
rocketmq.customized.trace.topic =
rocketmq.namespace =
rocketmq.namesrv.addr = 127.0.0.1:9876
rocketmq.retry.times.when.send.failed = 0
rocketmq.vip.channel.enabled = false
rocketmq.tag = ##################################################
######### 		    RabbitMQ	     #############
##################################################
rabbitmq.host =
rabbitmq.virtual.host =
rabbitmq.exchange =
rabbitmq.username =
rabbitmq.password =
rabbitmq.deliveryMode =

创建实例

  • admin 控制台中创建

image-20240402153359028

  • 载入模版进行配置

    如果没有特殊配置,修改数据库相关即可

    canal.instance.master.address=127.0.0.1:3306

    canal.instance.dbUsername=root
    canal.instance.dbPassword=123456

    canal.instance.filter相关的是监听数据库和表配置

#################################################
# 同mysql集群配置中的serverId,mysql的server_id参数
# canal.instance.mysql.slaveId=0# 开启gtid,生成同步数据全局id,防止主从不一致
canal.instance.gtidon=true# binlog的pos位点信息,修改时重建实例,或删除实例配置文件。
canal.instance.master.address=127.0.0.1:3306
#mysql起始的binlog文件,默认最新数据
canal.instance.master.journal.name= 
#mysql起始的binlog偏移量,只会在配置binlog文件中寻找
canal.instance.master.position=
#mysql起始的binlog时间戳,只会在配置binlog文件中寻找
canal.instance.master.timestamp=
#ysql起始的binlog的gtid,只会在配置binlog文件中寻找
canal.instance.master.gtid=# 阿里云rds的sso配置
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=# 开启tsdb功能,记录table mate变动
canal.instance.tsdb.enable=true
# tsdb数据存储在位置
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal# 备用数据库,当master数据库检查失败后,切换到该节点继续消费
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=# mysql连接用户名和密码
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
canal.instance.connectionCharset = UTF-8
# 开启druid数据库密码加密
canal.instance.enableDruid=false
# 加密公钥
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==# 匹配table表达式,需要处理的表
canal.instance.filter.regex=.*\\..*
# 匹配过滤table表达式,不需要处理的表
canal.instance.filter.black.regex=
# 匹配table字段表达式,指定传递字段,不指定全传。
#(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# 匹配过滤table字段表达式,不传递的字段,canal.instance.filter.field为空时生效@(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch# mq消息配置
# mq topic
canal.mq.topic=example
# 动态topic配置,topic为表名
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
# mq分区
canal.mq.partition=0
# hash分区数量 ,为空默认为1个分区
#canal.mq.partitionsNum=3
# hash分区主键,没有冒号就使用表名进行分区。有冒号使用字段进行分区。
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################
  • 启动 instance

image-20240402154242891

tcp 模式测试

package com.cdn.demo.mainTcpCanal;import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;import java.net.InetSocketAddress;
import java.util.List;import com.alibaba.otter.canal.common.utils.AddressUtils;
import com.alibaba.otter.canal.protocol.Message;
import com.alibaba.otter.canal.protocol.CanalEntry.Column;
import com.alibaba.otter.canal.protocol.CanalEntry.Entry;
import com.alibaba.otter.canal.protocol.CanalEntry.EntryType;
import com.alibaba.otter.canal.protocol.CanalEntry.EventType;
import com.alibaba.otter.canal.protocol.CanalEntry.RowChange;
import com.alibaba.otter.canal.protocol.CanalEntry.RowData;public class TcpCanalClient {public static void main(String args[]) {// 创建链接CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1",11111), "cdn", "", "");int batchSize = 1000;int emptyCount = 0;try {connector.connect();connector.subscribe(".*\\..*");connector.rollback();int totalEmptyCount = 120;while (emptyCount < totalEmptyCount) {Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据long batchId = message.getId();int size = message.getEntries().size();if (batchId == -1 || size == 0) {emptyCount++;System.out.println("empty count : " + emptyCount);try {Thread.sleep(1000);} catch (InterruptedException e) {}} else {emptyCount = 0;// System.out.printf("message[batchId=%s,size=%s] \n", batchId, size);printEntry(message.getEntries());}connector.ack(batchId); // 提交确认// connector.rollback(batchId); // 处理失败, 回滚数据}System.out.println("empty too many times, exit");} finally {connector.disconnect();}}private static void printEntry(List<Entry> entrys) {for (Entry entry : entrys) {if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) {continue;}RowChange rowChage = null;try {rowChage = RowChange.parseFrom(entry.getStoreValue());} catch (Exception e) {throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(),e);}EventType eventType = rowChage.getEventType();System.out.println(String.format("================&gt; binlog[%s:%s] , name[%s,%s] , eventType : %s",entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(),entry.getHeader().getSchemaName(), entry.getHeader().getTableName(),eventType));for (RowData rowData : rowChage.getRowDatasList()) {if (eventType == EventType.DELETE) {printColumn(rowData.getBeforeColumnsList());} else if (eventType == EventType.INSERT) {printColumn(rowData.getAfterColumnsList());} else {System.out.println("-------&gt; before");printColumn(rowData.getBeforeColumnsList());System.out.println("-------&gt; after");printColumn(rowData.getAfterColumnsList());}}}}private static void printColumn(List<Column> columns) {for (Column column : columns) {System.out.println(column.getName() + " : " + column.getValue() + "    update=" + column.getUpdated());}}
}
  • 运行 main 启动后,修改 mysql 中数据,即可获取到修改内容。

image-20240402154706504

---------------------------- 修改为MQ模式-----------------------

在canal-admin修改canal-deployer中的配置文件

只需要修改两项即可

  • 数据推送模式

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • MQ相关配置

    image-20240402155218346

监听代码

package com.cdn.demo.rabbit;/*** @author 蔡定努* @date 2024/04/01 13:38*/import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** Canal + RabbitMQ 监听数据库数据变化* @date 2021/11/4 23:14*/
@Component
@Slf4j
@RequiredArgsConstructor
public class CanalRabbitMqListener {@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "canal.queue", durable = "true"),exchange = @Exchange(value = "canal.exchange"),key = "canal.routing.key")},ackMode = "AUTO")public void handleDataChange(String message) {JSONObject jsonObject = JSON.parseObject(message);JSONArray data = jsonObject.getJSONArray("data");String database = jsonObject.getString("database");String id=jsonObject.getString("id");JSONArray oldData = jsonObject.getJSONArray("old");String tableName = jsonObject.getString("table");String type = jsonObject.getString("type");Boolean isDdl = jsonObject.getBoolean("isDdl");log.info("Canal 监听 {} ", message);}
}

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

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

相关文章

市场瞭望杂志市场瞭望杂志社市场瞭望编辑部2024年第2期目录

福山福水 拼经济&#xff0c;2024福建这样布局 林先昌 ;谢何平 ;余燕芳 ;陈强 ;王茜 ;刘星; 3-5 财经搜要 人民银行宣布“降准定向降息” 6《市场瞭望》投稿&#xff1a;cnqikantg126.com 两部门印发《意见》促进制造业中试创新发展 6 首部《中国企业信用年鉴》…

AI提速 OpenAI 新模型GPT-5今年上线?

这两天&#xff0c;有关OpenAI新模型 GPT-5的消息又多了起来。有知情人士称&#xff0c;OpenAI将在今年年中的某个时候发布GPT-5&#xff0c;很可能是在今年夏天期间。OpenAI CEO 萨姆奥特曼在一次播客采访中透露“GPT-5的智能水平得到提升”。 有趣的是&#xff0c;播客的主理…

阿里云免费证书过期更换证书操作步骤:

阿里云证书过期更换证书操作步骤&#xff1a; 登录阿里云控制台&#xff0c;搜索ssl证书&#xff0c;选择免费证书 点击创建证书&#xff0c;输入域名点确定&#xff0c;然后点击证书申请 选择文件验证方式&#xff0c;提交申请 下载验证文件fileauth.text到&#xff0c;解压后…

OpenHarmony实战:命令行工具hdc安装应用指南

一、工具概述 hdc&#xff08;OpenHarmony Device Connector&#xff09;是为开发人员提供的用于设备连接调试的命令行工具&#xff0c;该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备&#xff08;或模拟器&#xff09;进行连接调试通信。 简言之&#xf…

XenCenter 2024 导出虚拟机

选择导出 选择需要导出的虚拟机 导出位置&#xff0c;导出格式&#xff0c;名称 EULA 文档&#xff0c;根据自己需求配置 OVA是否需要加密验证&#xff0c;自己需要看&#xff0c;是否单独的OVA 确认导出配置&#xff0c;等待导出完成。 本地目录查看导出完成

Isaac sim的一些例程

一、standalone_examples 里面有AMR自主导航的例子&#xff0c;jetbot强化学习的例子等等&#xff1b; 二、 Simulated -> Demo Scenes &#xff08;physics demo scenes&#xff09; 这个里面有很多物理场景演示&#xff0c;如各种形态车辆&#xff0c;关节机器人&#xf…

亚远景科技-ASPICE评估输入

评估输入应在评估的数据收集阶段之前确定&#xff0c;并得到评估发起人的批准。 评估输入的任何更改都应征得发起人或发起人授权人的同意&#xff0c;并记录在评估记录中。 评估输入至少应明确以下内容&#xff1a; 原文链接&#xff1a;ASPICE评估-ASPICE评估输入-亚远景

拼多多跨境电商Temu:1688选品进货新思路

Temu&#xff0c;作为拼多多推出的跨境电商平台&#xff0c;自2022年9月正式上线以来&#xff0c;迅速在全球市场上崭露头角。这个平台秉承了拼多多的理念&#xff0c;致力于通过社交电商模式&#xff0c;为全球消费者提供物美价廉的商品。它不仅是一个购物平台&#xff0c;更是…

inBuilder 低代码平台新特性推荐 - 第十七期

今天来给大家带来的是 inBuilder 低代码平台特性推荐系列第十七期——如何在列表上添加图片。 一、 场景介绍 在表单开发的业务场景中&#xff0c;会有需要在列表上显示图片的场景&#xff0c;本文以车辆登记信息场景为例&#xff0c;介绍如何在列表上添加图片的开发过程。 …

linux离线安装NodeJs

一、官方下载 地址&#xff1a;Node.js — Download Node.js 选择linux系统版本 为了防止安装过程出现一些适配问题&#xff0c;我没有选择下载最新版&#xff0c;实际应该下载你的前端所用的nodejs版本 未完待续。。

GPT-5:更强的ChatGPT!将在高级推理功能上实现重大进步!GPT-5有哪些功能作用?

自 Claude 3 发布以来&#xff0c;外界对 GPT-5 的期待越来越强。毕竟Claude 3已经全面超越了 GPT-4&#xff0c;成为迄今为止最强大模型。 对于即将发布的GPT-5&#xff0c;有哪些期待&#xff1f; 目前来说&#xff0c;GPT-5的将具备哪些新能力&#xff1f; GPT-5性能进步…

Python是解释型语言,为啥还有 __pycache__ 文件呢?为啥还有.pyc 文件呢?

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 …

使用Java流API构建树形结构数据

简介&#xff1a; 在实际开发中&#xff0c;构建树状层次结构是常见需求&#xff0c;如组织架构、目录结构或菜单系统。本教案通过解析给定的Java代码&#xff0c;展示如何使用Java 8 Stream API将扁平化的菜单数据转换为具有层级关系的树形结构。 1. 核心类定义 - Menu Data…

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 &#xff0c;它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors &#xff0c;其中 colors[i] 是小写英文字母&#xff0c;表示图中第 i 个节点的 颜色 &#xf…

MySQL进阶-----SQL提示与覆盖索引

目录 前言 一、SQL提示 1.数据准备 2. SQL的自我选择 3.SQL提示 二、覆盖索引 前言 MySQL进阶篇的索引部分基本上要结束了&#xff0c;这里就剩下SQL提示、覆盖索引、前缀索引以及单例联合索引的内容。那本期的话我们就先讲解SQL提示和覆盖索引先&#xff0c;剩下的内容就…

HDU1020--编码问题

试题描述 问题详情如下图所示&#xff1a;要求&#xff1a;java实现、数据结构知识 参考代码 比较垃圾&#xff0c;在别人基础上改的&#xff0c;懒得重构&#xff0c;&#xff0c;&#xff0c;仅供参考 import java.util.Scanner;public class HDU1020StringEncoding {pu…

虚拟机安装银河麒麟

背景 由于Centos将于2024-06-30结束维护【脱保】&#xff0c;届时会存在Bug无人修复及功能无人开发等问题&#xff0c;所以要赶在这个节点前完成操作系统升级。可选的就是RedHat、Ubuntu以及国产信创【中标麒麟、银河麒麟、统信等】&#xff0c;或者使用云上操作系统【例如租阿…

【笔记】通过码云Gitee获取OpenHarmony源码

Note&#xff1a;下面包含操作过程和问题解决&#xff08;首次安装Ubuntu&#xff0c;环境未完善&#xff09;&#xff0c;没有遇到问题可以直接跳过问题part了&#xff0c;小白也能完成配置下载。 前置准备&#xff08;Git环境账号&#xff09; &#xff08;一&#xff09;安…

做抖店没有产品货源?怎么玩?筛选货源的方法你需要了解清楚!

大家好&#xff0c;我是电商小布。 有很多的新手朋友们在玩抖店的时候&#xff0c;遇到的第一个问题就是自己手里没有产品在。 没有产品货源&#xff0c;也就没办法上架店铺&#xff0c;更别提交易工作了。 那么在这种情况下&#xff0c;该怎么来玩呢&#xff1f; 既然我们…

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…