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

Flink 系列之十四 - Data Stream API的自定义数据类型

之前做过数据平台,对于实时数据采集,使用了Flink。现在想想,在数据开发平台中,Flink的身影几乎无处不在,由于之前是边用边学,总体有点混乱,借此空隙,整理一下Flink的内容,算是一个知识积累,同时也分享给大家。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Flink-1.19.x,Flink支持多种语言,这里的所有代码都是使用java,JDK版本使用的是19
代码参考:https://github.com/forever1986/flink-study.git

目录

  • 1 Flink的TypeInformation
    • 1.1 TypeInformation的关系
    • 1.2 Flink 内置的数据类型
  • 2 自定义类型的演示
    • 2.1 returns()方法
    • 2.2 Pojo类型
    • 2.3 自定义TypeInformation

Flink中的不同算子可能在不同线程、进程甚至机子,因此它们之间的数据传输就需要进行序列化。Flink有一套自定义的数据类型以及序列化规则。在前面一直使用的是基本类型或者元组类型,并没有定义序列化类,这是因为这些Flink都已经帮用户实现了一些基本数据类型的序列化。今天这一章来好好讲一下Flink对数据类型的支持以及如何自定义数据类型。

1 Flink的TypeInformation

序列化的本质就是将数据结构或者对象转换成一个二进制串的过程,在 Java 里面可以简单地理解成一个 byte 数组。而反序列化恰恰相反,就是将序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

在Flink中,它自定义了自己一套完整的序列化和子序列化过程。

  • 首先,Flink会根据类型找到自己本身自定义的数据类型的序列化器,如果存在则直接使用
  • 其次,用户可以通过registerType方法注册自己的数据类型序列化器,如果已经注册则使用
  • 再者,用户可以通过自定义 TypeInfo 和 TypeInfoFactory来实现自己的数据类型序列化,如果实现了,则使用
  • 以上都没有,则默认会交给 Kryo 处理(或者启用如Avro其它序列化框架)

1.1 TypeInformation的关系

前面所说的,Flink已经为用户实现了很多类型的序列化。其基础就是基于一个TypeInformation抽象类来实现不同数据类型的序列化,下面是根据TypeInformation源码的一些主要方法做一下解读:

public abstract class TypeInformation<T> implements Serializable {private static final long serialVersionUID = -7742311969684489493L;/*** 检查此类型信息是否表示基本类型。基本类型是Integer, Strings, Date, Void等等*/@PublicEvolvingpublic abstract boolean isBasicType();/*** 判断是否为元组类型*/@PublicEvolvingpublic abstract boolean isTupleType();/*** 获得没有嵌套的字段数*/@PublicEvolvingpublic abstract int getArity();/*** 获取该类型的字段数*/@PublicEvolvingpublic abstract int getTotalFields();/*** 返回该类型的Class*/@PublicEvolvingpublic abstract Class<T> getTypeClass();/*** 提供关于泛型类型参数到子类型的类型信息的映射,主要是泛化类型需要提供。*/@PublicEvolvingpublic Map<String, TypeInformation<?>> getGenericParameters() {return Collections.emptyMap();}/*** 该类型是否可以用作密钥。作为最低要求,类型必须是可哈希的,并且与键具有可比性。*/@PublicEvolvingpublic abstract boolean isKeyType();/*** 此类型是否可以用作排序的键。对这种类型进行排序产生的顺序必须是有意义的。*/@PublicEvolvingpublic boolean isSortKeyType() {return isKeyType();}/***   创建该类型的序列化器:TypeSerializer*/@PublicEvolvingpublic TypeSerializer<T> createSerializer(SerializerConfig config) {if (config != null) {ExecutionConfig executionConfig = ((SerializerConfigImpl) config).getExecutionConfig();return createSerializer(executionConfig);} else {return createSerializer((ExecutionConfig) null);}}/*** Flink提供typeHint方法为泛型指定类型,这个在讲typeHint使用时会说到*/public static <T> TypeInformation<T> of(TypeHint<T> typeHint) {return typeHint.getTypeInfo();}
}

1.2 Flink 内置的数据类型

Flink内置了很多数据类型,了解这些数据类型,就能够知道哪些情况下不需要自定义序列化:

在这里插入图片描述

根据上图,可以将Flink的内置数据类型分为几大类:

1)基础数据类型:主要处理基础数据类型,涵盖java的8大基础类型以及常见的void、String、Date、BigXXX、Instant,包括装箱或者未装箱,比如int、Integer等,其主要的实现类是BasicTypeInfo

2)数组类型:支持java的8大基础类型以及String。主要实现类是BasicArrayTypeInfo

3)元组类型:主要处理元组。Flink Tuples是固定长度固定类型的Java Tuple实现,不支持空值存储。主要实现类是TupleTypeInfo

4)辅助类型:主要处理列表、map等类型,其主要的实现类ListTypeInfo、MapTypeInfo、EitherTypeInfo等

5)复合类型:主要处理java中的元组、或者scala中的元组、Pojo等,其中Pojo需要符合一定规范。其主要的实现类TupleTypeInfo、RowTypeInfo、PojoTypeInfo等

6)泛型类型:主要是实现泛型类型,其主要的实现类有GenericTypeInfo。

7)其它类型:Flink还内置了很多其它的类型,这个使用到的再去看看。

知识点:上面Flink实现了很多基本类型的序列化工作,如果需要指定一定的TypeInformation数据类型,那么Flink提供了org.apache.flink.api.common.typeinfo.Types这个类,里面有很多基本TypeInformation数据类型常量,直接使用即可。

2 自定义类型的演示

在使用Flink过程中,与数据类型相关的无非就是以下三种场景,这里一一使用demo演示

代码参考:lesson07

1)新建子模块lesson07,其pom引入如下:

<dependency><groupId>org.apache.flink</groupId><artifactId>flink-clients</artifactId><scope>provided</scope>
</dependency>

2.1 returns()方法

虽然Flink已经为封装了很多类型,但是随着java的泛型的引入,基于历史原因以及性能改进就会出现泛型擦除的问题,在底层编译的时候,其实会对泛型进行擦除,导致JVM只能识别到是List,但是List中的数据是什么类型可能已经被擦除了,这个会导致运行时报错。

为了解决这个问题,Flink提供returns方法,在算子后面可以通过该方法,说明关于此操作符返回类型的类型信息提示。在Flink无法自动确定函数生成的类型的情况下,可以使用此方法。下面的案例来演示一下returns方法:

ReturnsDemo类:

import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class ReturnsDemo {public static void main(String[] args) throws Exception {// 1. 创建执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2. 读取数据DataStreamSource<String> text = env.socketTextStream("127.0.0.1", 9999);// 3. 计算text.map((String value) -> {String[] values = value.split(",");String value1 = values[0];double value2 = Double.parseDouble("0");long value3 = 0;if (values.length >= 2) {try {value2 = Double.parseDouble(values[1]);} catch (Exception e) {value2 = Double.parseDouble("0");}}if (values.length >= 3) {try {value3 = Long.parseLong(values[2]);} catch (Exception ignored) {}}return new Tuple3<>(value1, value2, value3);})// 方法1:如果不知道返回类型,这里会报错.returns(Types.TUPLE(Types.STRING, Types.DOUBLE, Types.LONG))// 方法2:使用TypeHint方式
//                .returns(new TypeHint<Tuple3<String,Double,Long>> (){}).print();// 执行env.execute();}
}

当不加入returns() 方法这行代码时,会报以下错误
在这里插入图片描述

知识点:在java中,当返回的是泛型,同时使用Lambda表达式时,就会出现泛型擦除问题,这时候需要使用returns方法指定算子的返回类型。returns方法有2种传入类型方式:
1)直接使用Types已经定义好的TypeInformation方式
2)使用TypeHint生成对应的TypeInformation方式

2.2 Pojo类型

从前面了解到,Flink支持很多基础数据类型,对于自定义的类,也提供了PojoTypeInfo支持自定义类的序列化。但是使用PojoTypeInfo对自定义的类序列化,需要符合以下条件:

  • 1)该类必须是public
  • 2)该类的属性要么是public,要么提供标准的setter/getter方法
  • 3)该类必须提供一个无参构造函数
  • 4)如果该类的某个属性也是自定义的类,那么属性对应的这个类也要符合1,2,3,4规则

PojoTypeDemol类:

import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class PojoTypeDemo {public static void main(String[] args) throws Exception {// 1. 创建执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2. 读取数据DataStreamSource<String> text = env.socketTextStream("127.0.0.1", 9999);// 3. 计算text.map((String value) -> {String[] values = value.split(",");String value1 = values[0];double value2 = Double.parseDouble("0");long value3 = 0;if (values.length >= 2) {try {value2 = Double.parseDouble(values[1]);} catch (Exception e) {value2 = Double.parseDouble("0");}}if (values.length >= 3) {try {value3 = Long.parseLong(values[2]);} catch (Exception ignored) {}}return new ServerInfo(value1, new CPUInfo(value2, "%"), value3);}).print();// 执行env.execute();}// 1.必须是publicpublic static class ServerInfo{// 2.属性要么是public,要么提供setter/getter方法public String serverId;// 3. 如果属性也是自定义的类型,那么这个类型也要符合1,2,3,4规则public CPUInfo cpuInfo;public Long time;// 4.必须提供一个无参构造函数public ServerInfo() {}public ServerInfo(String serverId, CPUInfo cpuInfo, Long time) {this.serverId = serverId;this.cpuInfo = cpuInfo;this.time = time;}public String getServerId() {return serverId;}public void setServerId(String serverId) {this.serverId = serverId;}public CPUInfo getCpuInfo() {return cpuInfo;}public void setCpuInfo(CPUInfo cpuInfo) {this.cpuInfo = cpuInfo;}public Long getTime() {return time;}public void setTime(Long time) {this.time = time;}}public static class CPUInfo{private Double cpu;private String unit;public CPUInfo() {}public CPUInfo(Double cpu, String unit) {this.cpu = cpu;this.unit = unit;}public Double getCpu() {return cpu;}public void setCpu(Double cpu) {this.cpu = cpu;}public String getUnit() {return unit;}public void setUnit(String unit) {this.unit = unit;}}
}

自定义的类如果不符合以上几点,则在运行时会报错:
在这里插入图片描述

2.3 自定义TypeInformation

Flink基本上能满足用户99.9%的需求,但如果Flink实现的序列化还不满足要求,用户可以自定义TypeInformation。

  • 1)需要实现TypeInformation,并实现其方法
  • 2)需要实现TypeSerializer,用于实现序列化

这里暂时没有想到一个实际场景,就不演示自定义TypeInformation

结语:本章通过讲解Flink的TypeInformation,对其数据类型也做了一个全面的了解。实际应用中或许涉及这方面的比较少,但是了解其使用原理,一旦遇到了就不会花费太多时间去找到问题所在。至此关于Data Stream API的章节就讲完了,接下来的章节,将了解Flink较为高级的概念。

相关文章:

Flink 系列之十四 - Data Stream API的自定义数据类型

之前做过数据平台&#xff0c;对于实时数据采集&#xff0c;使用了Flink。现在想想&#xff0c;在数据开发平台中&#xff0c;Flink的身影几乎无处不在&#xff0c;由于之前是边用边学&#xff0c;总体有点混乱&#xff0c;借此空隙&#xff0c;整理一下Flink的内容&#xff0c…...

【数据结构】线性表

目录 1.1 线性表的概念 1.1.1 线性表的抽象数据类型 1.1.2 线性表的存储结构 1.1.3 线性表运算分类 1.2 顺序表 1.2.1 顺序表的类定义 1.2.2 顺序表的运算实现 1. 顺序表的检索 2. 顺序表的插入 3. 顺序表的删除 1.3 链表 1.3.1 单链表 1. 链表的检索 2. 链表的插…...

大疆卓驭嵌入式面经及参考答案

FreeRTOS 有哪 5 种内存管理方式&#xff1f; heap_1.c&#xff1a;这种方式简单地在编译时分配一块固定大小的内存&#xff0c;在整个运行期间不会进行内存的动态分配和释放。它适用于那些对内存使用需求非常明确且固定&#xff0c;不需要动态分配内存的场景&#xff0c;优点是…...

【网络】:传输层协议 —— UDP、TCP协议

目录 UDP协议 UDP协议的核心特点 UDP协议格式 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP协议的核心特点 TCP协议格式 确认应答机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 基于字节流 粘包和拆包 可靠性和性能保障 基于TCP的应用层…...

每日c/c++题 备战蓝桥杯(洛谷P1115 最大子段和)

洛谷P1115 最大子段和 题解 题目描述 最大子段和是一道经典的动态规划问题。题目要求&#xff1a;给定一个包含n个整数的序列&#xff0c;找出其中和最大的连续子序列&#xff0c;并输出该最大和。若所有数均为负数&#xff0c;则取最大的那个数。 输入格式&#xff1a; 第…...

Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)

一、背景介绍 DUT集成了多个可调衰减的射频通道&#xff0c;可调衰减由高精度DAC和VVA构成&#xff0c;使用中电思仪的3671E矢量网络分析仪测试DUT的S参数&#xff0c;并自动化调整VVA的控制电压&#xff0c;以自动化获取指定衰减值对应的控制电平。 二、前期准备 Python环境&…...

设计模式系列(1):总览与引导

目录 前言 设计模式简介 UML与设计模式 术语解释 UML工具与PlantUML 面向对象设计原则(SOLID等) 设计模式分类与典型场景 设计模式的价值 学习与实践建议 常见面试题 推荐阅读 1. 前言 本篇为设计模式系列的第一篇,定位为总览和引导,旨在为后续各专题打下基础,帮助大家…...

Day21打卡—常见降维算法

知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-sne降维 作业&#xff1a; 自由作业&#xff1a;探索下什么时候用到降维&#xff1f;降维的主要应用&#xff1f;或者让ai给你出题&#xff0c;群里的同学互相学习下。可以考虑对比下在某些特定数据集上t-sne的可视化和pca可…...

什么是人工智能(Artificial Intelligence,AI)? —— 机器学习 =》 深度学习 =》 新型技术

文章目录 什么是人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1f; —— 关系&#xff1a;AI >> ML >> DL一、机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;1、历史2、类型&#xff08;1&#xff09;监督学习…...

iVX 平台技术解析:图形化与组件化的融合创新

一、图形化逻辑编程&#xff1a;用流程图替代代码的革命 iVX 的核心突破在于可视化逻辑表达—— 开发者通过拖拽 “逻辑块”&#xff08;如条件判断、循环控制、数据操作等&#xff09;来搭建应用逻辑&#xff0c;彻底摒弃传统代码的字符输入模式。这种 “所见即所得” 的开发…...

【Diffusion】在华为云ModelArts上运行MindSpore扩散模型教程

目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 一、…...

跟我学c++高级篇——模板元编程之十三处理逻辑

一、元编程处理逻辑 无论在普通编程还是在元编程中&#xff0c;逻辑的处理&#xff0c;都是一个编程开始的必然经过。开发者对普通编程中的逻辑处理一般都非常清楚&#xff0c;不外乎条件谈判和循环处理。而条件判断常见的基本就是if语句&#xff08;switch如果不考虑效率等情…...

组合模式(Composite Pattern)详解

文章目录 1. 什么是组合模式?2. 为什么需要组合模式?3. 组合模式的核心概念4. 组合模式的结构5. 组合模式的基本实现5.1 基础示例:文件系统5.2 透明组合模式 vs 安全组合模式5.2.1 透明组合模式5.2.2 安全组合模式5.3 实例:公司组织结构5.4 实例:GUI组件树6. Java中组合模…...

最长字符串 / STL+BFS

题目 代码 #include <bits/stdc.h> using namespace std;int main() {map<vector<int>, vector<string>> a;set<vector<int>> c;vector<int> initial(26, 0);c.insert(initial);ifstream infile("words.txt");string s;w…...

C++ stl中的set、multiset、map、multimap的相关函数用法

文章目录 序列式容器和关联式容器树形结构和哈希结构树形结构哈希结构 键值对setset的相关介绍set定义方式set相关成员函数multiset mapmap的相关介绍map定义方式map的相关操作1.map的插入2.map的查找3.map的删除 序列式容器和关联式容器 CSTL中包含了序列式容器和关联式容器&…...

普通IT的股票交易成长史--20250511 美元与美股强相关性

声明&#xff1a;本文章的内容非原创。参考了yt博主Andy Lee的观点&#xff0c;为了加深自己的学习印象才做的复盘&#xff0c;不构成投资建议。感谢他的无私奉献&#xff01; 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#x…...

系统架构设计(四):架构风格总结

黑板 概念 黑板体系架构是一种用于求解复杂问题的软件架构风格&#xff0c;尤其适合知识密集型、推理驱动、数据不确定性大的场景。 它模拟了人类专家协同解决问题的方式&#xff0c;通过一个共享的“黑板”协同多个模块&#xff08;专家&#xff09;逐步构建解决方案。 组…...

ElasticSearch进阶

一、文档批量操作 1.批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式&#xff1a;GET请求地址&#xff1a;_mget功能说明 &#xff1a; 可以通过ID批量获取不同index和type的数据请求参数&#xff1a; docs : 文档数组参…...

0基础 | L298N电机驱动模块 | 使用指南

引言 在嵌入式系统开发中&#xff0c;电机驱动是一个常见且重要的功能。L298N是一款高电压、大电流电机驱动芯片&#xff0c;广泛应用于各种电机控制场景&#xff0c;如直流电机的正反转、调速&#xff0c;以及步进电机的驱动等。本文将详细介绍如何使用51单片机来控制L298N电…...

Synchronized与锁升级

一、面试题 1&#xff09;谈谈你对Synchronized的理解 2&#xff09;Sychronized的锁升级你聊聊 3&#xff09;Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#…...

MNIST DDP 分布式数据并行

Distributed Data Parallel 转自我的个人博客&#xff1a;https://shar-pen.github.io/2025/05/04/torch-distributed-series/3.MNIST_DDP/ The difference between DistributedDataParallel and DataParallel is: DistributedDataParallel uses multiprocessing where a proc…...

语音合成之十三 中文文本归一化在现代语音合成系统中的应用与实践

中文文本归一化在现代语音合成系统中的应用与实践 引言理解中文文本归一化&#xff08;TN&#xff09;3 主流LLM驱动的TTS系统及其对中文文本归一化的需求分析A. SparkTTS&#xff08;基于Qwen2.5&#xff09;与文本归一化B. CosyVoice&#xff08;基于Qwen&#xff09;与文本归…...

9.1.领域驱动设计

目录 一、领域驱动设计核心哲学 战略设计与战术设计的分野 • 战略设计&#xff1a;限界上下文&#xff08;Bounded Context&#xff09;与上下文映射&#xff08;Context Mapping&#xff09; • 战术设计&#xff1a;实体、值对象、聚合根、领域服务的构建原则 统一语言&am…...

如何配置光猫+路由器实现外网IP访问内部网络?

文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置&#xff08;路由模式时&#xff09; 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置&#xff08;可选&#xff09; 五、防火墙设置六、测试配置七、安全注意事…...

C++题题题题题题题题题踢踢踢

后缀表达式求值 #include<bits/stdc.h> #include<algorithm> using namespace std; string a[100]; string b[100]; stack<string> op; int la0,lb0; int main(){while(true){cin>>a[la];if(a[la]".") break;la;}for(int i0;i<la;i){if(…...

M. Moving Both Hands(反向图+Dijkstra)

Problem - 1725M - Codeforces 题目大意&#xff1a;给你一个有向图&#xff0c;起始点在1&#xff0c;问起始点分别与另外n-1个 点相遇的最短时间&#xff0c;无法相遇输出-1。 思路&#xff1a;反向建图&#xff0c;第一层建原图&#xff0c;第二层建反向图&#xff0c;两层…...

11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design

76个工业组件库示例汇总 参数化三维产品设计组件 (注塑模具与公差分析) 概述 这是一个交互式的 Web 组件&#xff0c;旨在演示简单的三维零件&#xff08;如带凸台的方块&#xff09;的参数化设计过程&#xff0c;并结合注塑模具设计&#xff08;如开模动画&#xff09;与公…...

智能座舱开发工程师面试题

一、基础知识类 简述智能座舱的核心组成部分及其功能 要求从硬件&#xff08;如显示屏、传感器、控制器&#xff09;和软件&#xff08;操作系统、中间件、应用程序&#xff09;层面展开&#xff0c;阐述各部分如何协同实现座舱的智能化体验。 对比 Android Automotive、QNX…...

【连载14】基础智能体的进展与挑战综述-多智能体系统设计

基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 在基于大语言模型的多智能体系统&#xff08;LLM-MAS&#xff09;中&#xff0c;合作目标和合…...

06.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending

本实例主要讲解内容 这个Three.js示例展示了**骨骼动画(Skinning)和变形动画(Morphing)**的结合应用。通过加载一个机器人模型&#xff0c;演示了如何同时控制角色的肢体动作和面部表情&#xff0c;实现更加丰富的角色动画效果。 核心技术包括&#xff1a; 多动画混合与淡入…...

【Java学习日记36】:javabeen学生系统

ideal快捷键...

.Net HttpClient 使用请求数据

HttpClient 使用请求数据 0、初始化及全局设置 //初始化&#xff1a;必须先执行一次 #!import ./ini.ipynb1、使用url 传参 参数放在Url里&#xff0c;形如&#xff1a;http://www.baidu.com?namezhangsan&age18, GET、Head请求用的比较多。优点是简单、方便&#xff0…...

详解 Java 并发编程 synchronized 关键字

synchronized 关键字的作用 synchronized 是 Java 中用于实现线程同步的关键字&#xff0c;主要用于解决多线程环境下的资源竞争问题。它可以修饰方法或代码块&#xff0c;确保同一时间只有一个线程可以执行被修饰的代码&#xff0c;从而避免数据不一致的问题。 synchronized…...

《Go小技巧易错点100例》第三十二篇

本期分享&#xff1a; 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全&#xff1a; 1&#xff09;双存储结构&#xff1a; 包含原子化的 read&#xff08;只读缓存&#xff0c;无锁快…...

时序约束高级进阶使用详解四:Set_False_Path

目录 一、背景 二、Set_False_Path 2.1 Set_false_path常用场景 2.2 Set_false_path的优势 2.3 Set_false_path设置项 2.4 细节区分 三、工程示例 3.1 工程代码 3.2 时序约束如下 3.3 时序报告 3.4 常规场景 3.4.1 设计代码 3.4.2 约束场景 3.4.3 约束对象总结…...

每日定投40刀BTC(16)20250428 - 20250511

定投 坚持 《恒道》 长河九曲本微流&#xff0c;岱岳摩云起累丘。 铁杵十年销作刃&#xff0c;寒窗五鼓淬成钩。已谙蜀栈盘空险&#xff0c;更蓄湘竹带泪遒。 莫问枯荣何日证&#xff0c;星霜满鬓亦从头。...

C# 高效处理海量数据:解决嵌套并行的性能陷阱

C# 高效处理海量数据&#xff1a;解决嵌套并行的性能陷阱 问题场景 假设我们需要在 10万条ID 和 1万个目录路径 中&#xff0c;快速找到所有满足以下条件的路径&#xff1a; 路径本身包含ID字符串该路径的子目录中也包含同名ID 初始代码采用Parallel.ForEach嵌套Task.Run&am…...

【Java EE初阶 --- 多线程(初阶)】线程安全问题

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 线程不安全的原因根本原因…...

从InfluxDB到StarRocks:Grab实现Spark监控平台10倍性能提升

Grab 是东南亚领先的超级应用&#xff0c;业务涵盖外卖配送、出行服务和数字金融&#xff0c;覆盖东南亚八个国家的 800 多个城市&#xff0c;每天为数百万用户提供一站式服务&#xff0c;包括点餐、购物、寄送包裹、打车、在线支付等。 为了优化 Spark 监控性能&#xff0c;Gr…...

《Redis应用实例》学习笔记,第一章:缓存文本数据

前言 最近在学习《Redis应用实例》&#xff0c;这本书并没有讲任何底层&#xff0c;而是聚焦实战用法&#xff0c;梳理了 32 种 Redis 的常见用法。我的笔记在 Github 上&#xff0c;用 Jupyter 记录&#xff0c;会有更好的阅读体验&#xff0c;作者的源码在这里&#xff1a;h…...

Redis 缓存

缓存介绍 Redis 最主要三个用途&#xff1a; 1&#xff09;存储数据&#xff08;内存数据库&#xff09; 2&#xff09;消息队列 3&#xff09;缓存 对于硬件的访问速度&#xff0c;通常有以下情况&#xff1a; CPU 寄存器 > 内存 > 硬盘 > 网络 缓存的核心…...

Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析

Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析 在实时数据处理和流式计算领域,Apache Flink 已成为行业标杆。而 Flink CDC(Change Data Capture) 作为其生态中的重要组件,为数据库的实时变更捕获提供了强大的能力。 本文将从以下几个方面进行深入讲解: 什…...

缓存(4):常见缓存 概念、问题、现象 及 预防问题

常见缓存概念 缓存特征: 命中率、最大元素、清空策略 命中率&#xff1a;命中率返回正确结果数/请求缓存次数 它是衡量缓存有效性的重要指标。命中率越高&#xff0c;表明缓存的使用率越高。 最大元素&#xff08;最大空间&#xff09;&#xff1a;缓存中可以存放的最大元素的…...

实战项目6(09)

目录 任务场景一 【r1配置】 【r2配置】 【r3配置】 ​​​​​​​任务场景二 【r1配置】 【r2配置】 【r3配置】 ​​​​​​​任务场景三 【r1配置】 【r2配置】 【r3配置】 ​​​​​​​任务场景一 按照下图完成网络拓扑搭建和配置 任务要求&#xff1a;在…...

MySQL 数据库故障排查指南

MySQL 数据库故障排查指南 本指南旨在帮助您识别和解决常见的 MySQL 数据库故障。我们将从问题识别开始&#xff0c;逐步深入到具体的故障类型和排查步骤。 1. 问题识别与信息收集 在开始排查之前&#xff0c;首先需要清晰地了解问题的现象和范围。 故障现象&#xff1a; 数…...

MacOS Python3安装

python一般在Mac上会自带&#xff0c;但是大多都是python2。 python2和python3并不存在上下版本兼容的情况&#xff0c;所以python2和python3可以同时安装在一台设备上&#xff0c;并且python3的一些语法和python2并不互通。 所以在Mac电脑上即使有自带python&#xff0c;想要使…...

锁相放大技术:从噪声中提取微弱信号的利器

锁相放大技术&#xff1a;从噪声中提取微弱信号的利器 一、什么是锁相放大&#xff1f; 锁相放大&#xff08;Lock-in Amplification&#xff09;是一种用于检测微弱信号的技术&#xff0c;它能够从强噪声背景中提取出我们感兴趣的特定信号。想象一下在嘈杂的派对上听清某个人…...

机器学习总结

1.BN【batch normalization】 https://zhuanlan.zhihu.com/p/93643523 减少 2.L1L2正则化 l1:稀疏 l2:权重减小 3.泛化误差 训练误差计算了训练集的误差&#xff0c;而泛化误差是计算全集的误差。 4.dropout 训练过程中神经元p的概率失活 一文彻底搞懂深度学习&#x…...

基于神经网络的无源雷达测向系统仿真实现

基于神经网络的无源雷达测向系统仿真实现 项目概述 本项目实现了基于卷积神经网络(CNN)的无源雷达方向到达角(DOA)估计系统。通过深度学习方法&#xff0c;系统能够从接收到的雷达信号中准确估计出信号源的方向&#xff0c;适用于单目标和多目标场景。相比传统的DOA估计算法&…...

《用MATLAB玩转游戏开发》Flappy Bird:小鸟飞行大战MATLAB趣味实现

《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08;2D图形交互&#xff09;-Flappy Bird&#xff1a;小鸟飞行大战MATLAB趣味实现 文章目录 《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08;2D图形交互&#xf…...