FlinkSql入门与实践
一、为什么需要 Flink SQL?
传统 SQL 是面向静态数据的查询语言,而现代实时业务要求对动态数据流进行即时分析。Flink SQL 应运而生,它让开发者无需编写复杂的状态管理代码,就能实现实时ETL、复杂事件处理(CEP)、实时报表等场景。其核心优势在于:
- 统一流批接口:同一套 SQL 语法同时处理 Kafka 实时流和 Hive 历史数据。
- 低代码开发:用声明式语言替代 Java/Scala API,降低开发门槛。
- 无缝集成生态:直接对接 Kafka、MySQL、HBase、Redis 等外部系统。
- 自动优化执行:基于 Calcite 优化器生成高效执行计划,提升吞吐量。
二、Flink SQL 核心架构与原理
1. 分层架构解析
- SQL 解析层:将 SQL 语句转换为抽象语法树(AST),校验语法。
- 逻辑计划层:生成逻辑执行计划(Logical Plan),定义数据流转关系。
- 优化层:应用规则优化(如谓词下推、投影消除)和成本优化(基于统计信息)。
- 物理计划层:转换为 Flink 的 DataStream/DataSet API,生成 JobGraph。
2. 动态表(Dynamic Table)模型
Flink SQL 的核心抽象是动态表——随时间变化的表。与传统数据库表不同,动态表通过 INSERT、UPDATE、DELETE 操作持续更新。例如:
- Append-Only 流:仅追加数据(如日志流),对应动态表的 INSERT 操作。
- Upsert 流:带主键的更新流(如订单状态变更),对应 INSERT/UPDATE 操作。
-- 将 Kafka 数据流映射为动态表
CREATE TABLE user_behavior (user_id BIGINT,item_id BIGINT,action STRING,ts TIMESTAMP(3),WATERMARK FOR ts AS ts - INTERVAL '5' SECOND
) WITH ('connector' = 'kafka','topic' = 'user_behavior','scan.startup.mode' = 'earliest-offset'
);
3. 时间属性与窗口
- 事件时间(Event Time):基于数据自带的时间戳,需定义
WATERMARK
。 - 处理时间(Processing Time):基于系统时钟,无需额外配置。
- 窗口操作:滚动窗口(TUMBLE)、滑动窗口(HOP)、会话窗口(SESSION)。
-- 统计每5分钟各商品的点击量(事件时间窗口)
SELECT item_id,TUMBLE_START(ts, INTERVAL '5' MINUTE) AS window_start,COUNT(*) AS clicks
FROM user_behavior
WHERE action = 'click'
GROUP BY item_id,TUMBLE(ts, INTERVAL '5' MINUTE);
三、Flink SQL 基础实战
1. 环境搭建
- Local 模式:直接通过
sql-client.sh
启动。 - 集群模式:集成 YARN/Kubernetes,通过
sql-client
提交作业。
2. DDL 与 DML
- DDL(数据定义语言):定义表结构、连接器、格式等。
- DML(数据操作语言):执行查询、插入、更新操作。
-- 创建 MySQL 结果表
CREATE TABLE item_clicks (item_id BIGINT,window_start TIMESTAMP(3),clicks BIGINT,PRIMARY KEY (item_id) NOT ENFORCED
) WITH ('connector' = 'jdbc','url' = 'jdbc:mysql://localhost:3306/flink','table-name' = 'item_clicks'
);-- 将聚合结果写入 MySQL
INSERT INTO item_clicks
SELECT item_id,TUMBLE_START(ts, INTERVAL '5' MINUTE) AS window_start,COUNT(*) AS clicks
FROM user_behavior
WHERE action = 'click'
GROUP BY item_id,TUMBLE(ts, INTERVAL '5' MINUTE);
3. 常用函数与 UDF
- 内置函数:字符串处理(
SUBSTRING
)、时间函数(DATE_FORMAT
)、聚合函数(SUM
)。 - UDF(用户自定义函数):通过 Java/Scala 扩展逻辑。
// 定义 UDF:提取 URL 中的域名
public class ExtractDomain extends ScalarFunction {public String eval(String url) {return url.split("//")[1].split("/")[0];}
}// SQL 中注册使用
tEnv.createTemporarySystemFunction("extract_domain", ExtractDomain.class);
四、Flink SQL 深度实践
1. 状态管理与容错
- 状态后端:RocksDB 适合大状态场景,内存状态后端适合测试。
- Checkpoint 配置:间隔时间、超时阈值、对齐方式。
-- 设置 Checkpoint 参数(需在 Flink 配置中生效)
SET 'execution.checkpointing.interval' = '1min';
SET 'execution.checkpointing.timeout' = '3min';
2. 维表 Join(Temporal Table Join)
实时流与外部维表(如 MySQL)关联时,需通过 Lookup Join 或 Temporal Table 实现。
-- 定义汇率维表(支持版本查询)
CREATE TABLE currency_rates (currency STRING,rate DECIMAL(10, 4),update_time TIMESTAMP(3),WATERMARK FOR update_time AS update_time - INTERVAL '30' SECOND
) WITH ('connector' = 'jdbc','url' = 'jdbc:mysql://localhost:3306/finance','table-name' = 'currency_rates'
);-- 将维表声明为 Temporal Table
CREATE TEMPORARY VIEW rates AS
SELECT currency, rate, update_time
FROM currency_rates
FOR SYSTEM_TIME AS OF update_time;-- 流表与维表关联
SELECT o.order_id,o.amount * r.rate AS amount_usd
FROM orders AS o
JOIN rates FOR SYSTEM_TIME AS OF o.order_time AS r
ON o.currency = r.currency;
3. 复杂事件处理(CEP)
通过 MATCH_RECOGNIZE
实现模式匹配(如检测连续登录失败)。
SELECT *
FROM user_login_events
MATCH_RECOGNIZE (PARTITION BY user_idORDER BY event_timeMEASURESSTART_ROW.event_time AS start_time,LAST(FAIL.event_time) AS end_time,COUNT(FAIL.*) AS failuresONE ROW PER MATCHAFTER MATCH SKIP TO LAST FAILPATTERN (START FAIL{3})DEFINEFAIL AS FAIL.action = 'login_failed'
);
4. 流式 ETL 与 CDC 集成
通过 Debezium 捕获 MySQL 的变更数据(CDC),实时同步到 Hudi 数据湖。
-- 创建 MySQL CDC 表
CREATE TABLE orders_cdc (id BIGINT,amount DECIMAL(10, 2),status STRING,update_time TIMESTAMP(3),PRIMARY KEY (id) NOT ENFORCED
) WITH ('connector' = 'mysql-cdc','hostname' = 'localhost','port' = '3306','database-name' = 'mydb','table-name' = 'orders'
);-- 写入 Hudi 表
INSERT INTO hudi_orders
SELECT id, amount, status, update_time
FROM orders_cdc;
五、性能调优与生产实践
1. 资源配置
- 并行度:根据数据量和算子复杂度调整。
- 内存管理:合理分配 TaskManager 的堆内存与托管内存。
-- 设置作业并行度
SET 'parallelism.default' = '8';
2. 优化技巧
- 避免全量状态:使用
STATE TTL
清理过期状态。 - 分区剪枝:在 WHERE 条件中提前过滤数据。
- Mini-Batch 聚合:降低处理延迟与状态访问开销。
-- 启用 Mini-Batch 聚合(需在配置中设置)
SET 'table.exec.mini-batch.enabled' = 'true';
SET 'table.exec.mini-batch.allow-latency' = '5s';
SET 'table.exec.mini-batch.size' = '1000';
3. 监控与诊断
- Flink Web UI:查看反压、Checkpoint 状态、算子吞吐量。
- Metrics Reporter:集成 Prometheus + Grafana 实现可视化监控。
六、典型场景案例
案例1:实时用户行为分析
- 输入:Kafka 用户点击流(JSON 格式)。
- 处理:过滤异常点击、统计实时 PV/UV。
- 输出:写入 ClickHouse 供实时大屏展示。
案例2:金融风控规则引擎
- 输入:交易事件流(Protobuf 格式)。
- 处理:通过 CEP 检测异常交易模式(如高频小额转账)。
- 输出:触发告警并写入 Elasticsearch。
案例3:电商实时数仓
- 输入:订单、支付、物流等多源数据。
- 处理:多流 Join 生成宽表,实时计算 GMV。
- 输出:写入 Hudi 提供准实时查询。
七、避坑指南
-
乱序数据处理
- 设置合理的
WATERMARK
延迟和allowedLateness
。 - 使用
CUMULATE
窗口替代TUMBLE
窗口,缓解乱序影响。
- 设置合理的
-
维表 Join 性能
- 启用缓存(
lookup.cache.max-rows
、lookup.cache.ttl
)。 - 避免频繁查询大维表,可预加载热点数据到 Flink 状态。
- 启用缓存(
-
状态膨胀
- 为 Keyed State 设置
STATE TTL
。 - 定期压缩 RocksDB 状态(
state.backend.rocksdb.compaction.level
)。
- 为 Keyed State 设置
相关文章:
FlinkSql入门与实践
一、为什么需要 Flink SQL? 传统 SQL 是面向静态数据的查询语言,而现代实时业务要求对动态数据流进行即时分析。Flink SQL 应运而生,它让开发者无需编写复杂的状态管理代码,就能实现实时ETL、复杂事件处理(CEP&#x…...
【物联网】基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版)
演示视频: 基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版) 前言:本设计是基于ThingsCloud云平台版,还有另外一个版本是基于机智云平台版本,两个设计只是云平台和手机APP的区别,其他功能都一样。如下链接: 【物联网】基于LORA组网的远程环境监测系统设计(机…...
C++中指针Ptr(一级指针、二级指针)的基本使用详解(1)
C 中的指针是非常强大的工具,理解一级指针、二级指针以及它们与数组的关系,对于写出高效且安全的程序非常重要。下面我将从基础讲起,详细解释 一级指针、二级指针 的使用,注意事项,以及它们和数组之间的联系与区别&…...
科技赋能建筑新未来:中建海龙模块化建筑产品入选中国建筑首批产业化推广产品
在建筑工业化浪潮中,中国建筑国际集团旗下中建海龙科技有限公司(以下简称“中建海龙”)致力以科技创新赋能传统建造转型升级,大力发展新质生产力,促进科技成果在建筑产业体系化、规模化应用,面向“产品化、…...
示例:Spring JDBC 声明式事务(xml配置形式)
声明式事务是指在不修改源代码的情况下通过配置applicationContext.xml自动实现事务控制,其本质是AOP环绕通知。它的触发时机为:1、当目标方法执行成功时自动提交事务,2、当目标方法抛出运行时异常时,自动事务回滚 核心步骤示例&a…...
java多线程(7.0)
目录 编辑 定时器 定时器的使用 三.定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 定时器 定时器是软件开发中的一个重要组件. 类似于一个 "闹钟". 达到一个设定的时间之后, 就执行某个指定好的…...
sgpt在kali应用
Kali Linux 下 sgpt 渗透测试相关案例 1. 扫描目标主机存活 sgpt -s "使用 nmap 扫描 192.168.1.100 是否存活"示例命令: nmap -sn 192.168.1.1002. 扫描目标主机开放端口和服务 sgpt -s "使用 nmap 扫描 192.168.1.100 常见端口和服务"示例…...
小白电路设计-设计11-恒功率充电电路设计
介绍 作为电子信息工程的我,电路学习是一定要学习的,可惜目前作为EMC测试工程师,无法兼顾太多,索性不如直接将所学的知识进行运用,并且也可以作为契机,进行我本人的个人提升。祝大家与我一起进行提升。1.本…...
express的模板handlebars用app.engine()创建配置和用exphbs.create()的区别
在使用 express-handlebars 时,app.engine 和 exphbs.create 都可以用来配置 Handlebars 模板引擎,但它们的使用方式和功能有一些区别。以下是详细的对比和说明 app.engine 方法 app.engine 是 Express 提供的方法,用于注册一个新的模板引擎…...
【Python数据库与后端开发】从ORM到RESTful API
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:SQLAlchemy模型定义案例2:FastAPI异步接口案例3:连接池配…...
数据结构(java)二叉树的基本操作
1.二叉树的性质: 1.若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2*-1(i>0)个结点 2.若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2都k次方-1 3.对于任何一个二叉树,如果其叶结点个数为 n…...
windows编程字符串处理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、windows常用字符出处理函数?二、测试代码总结 前言 提示:这里可以添加本文要记录的大概内容: Windows编程中主要使用两…...
CentOS系统防火墙服务介绍
CentOS 系统使用的是 firewalld 防火墙服务(从 CentOS 7 开始),它基于 zone(区域) 和 service(服务) 的机制来配置网络访问控制,替代了传统的 iptables。 iptables 是 Linux 系统中…...
59、微服务保姆教程(二)Nacos--- 微服务 注册中心 + 配置中心
Nacos— 微服务 注册中心 + 配置中心 一.什么是Nacos? Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。 Nacos核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”,也就是我们的注册中心和配…...
Git命令行中vim的操作
Git命令行用vim打开文件,或者用其他git命令打开了文件,需要编辑和保存文件等,有些命令表情奇怪,往往容易忘记这些命令。记录下。 下面这篇比较实用和简练: gitvim编辑文件命令 • Worktile社区https://worktile.com/…...
【分布式系统中的“瑞士军刀”_ Zookeeper】一、Zookeeper 快速入门和核心概念
在分布式系统的复杂世界里,协调与同步是确保系统稳定运行的关键所在。Zookeeper 作为分布式协调服务的 “瑞士军刀”,为众多分布式项目提供了高效、可靠的协调解决方案。无论是在分布式锁的实现、配置管理,还是在服务注册与发现等场景中&…...
【昇腾】【训练】800TA2-910B使用LLaMA-Factory训练Qwen
文章目录 1. 使用docker安装1.1 配置docker1. 2 拉取 LLaMA-Factory1.3 修改配置 2. 下载模型3. 准备训练数据3.1 下载数据集3.2 自定义数据集配置 4. 训练4.1 训练配置4.2 启动训练4.3 训练效果测试 5. 合并权重 更好的阅读体验:传送门 服务器:800TA2 芯…...
Python自动化解决滑块验证码的最佳实践
1. 引言:滑块验证码的挑战与自动化需求 滑块验证码(Slider CAPTCHA)是当前互联网广泛使用的反爬机制之一,它要求用户手动拖动滑块到指定位置以完成验证。这种验证方式可以有效阻止简单的自动化脚本,但对爬虫开发者来说…...
知识蒸馏和迁移学习的区别
知识蒸馏和迁移学习虽然都涉及知识的传递,但并不是同一个概念,它们在目的、方法和应用场景上有显著区别: 1. 定义与核心思想 迁移学习(Transfer Learning) 是一种广义的机器学习范式,核心是将从一个任务或领…...
二项分布详解:从基础到应用
二项分布详解:从基础到应用 目录 引言二项分布的定义概率质量函数及其证明期望与方差推导二项分布的重要性质常见应用场景与其他分布的关系知识梳理练习与思考 引言 概率论中,二项分布是最基础也是最常用的离散概率分布之一。它描述了在固定次数的独…...
迁移学习(基础)
迁移学习理论 目标 迁移学习中的有关概念掌握迁移学习的两种方式 概念 预训练模型微调微调脚本 预训练模型(Pretrained model) 一般情况下预训练模型都是大型模型, 具备复杂的网络结构, 众多的参数量, 以及足够大的数据集进行训练而产生的模型, 在NLP领域, 预训练模型往往…...
云服务器和独立服务器的区别在哪
在当今数字化的时代,服务器成为了支撑各种业务和应用的重要基石。而在服务器的领域中,云服务器和独立服务器是两个备受关注的选项。那么,它们到底有何区别呢? 首先,让我们来聊聊成本。云服务器通常采用按需付费的模式…...
大模型时代的深度学习框架
作者:算力魔方创始人/英特尔创新大使刘力 在CNN时代,AI模型的参数规模都在百万级别,仅需在单张消费类显卡上即可完成训练。例如,以业界知名的CNN模型:ResNet50为例,模型参数量是约为 25.63M,在…...
BIOS主板(非UEFI)安装fedora42的方法
BIOS主板(非UEFI)安装fedora42的方法 现实困难:将Fedora-Workstation-Live-42-1.1.x86_64.iso写入U盘制作成可启动U盘启动fedora42,按照向导将fedora42安装到真机的sda7分区中得到报错如下内容: /boot/efi 必需的 /boot/efi必须位于格式化为e…...
C# 综合示例 库存管理系统7 主界面(FormMain)
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 图99A-22 主界面窗口设计 主界面是多文档界面容器,需要将窗体属性IsMdiContainer设置为True。关于多文档界面编程请参看教程第7.12节《多文档界面》。 主界面并不提…...
1、RabbitMQ的概述笔记
一、什么是RabbitMQ Rabbit是一个公司名.MQ(nessage queue) 消息队列的意思,RabbitMQ 是 Rabbit企业下的一个消息队列产品。 RabbitMQ 是⼀个实现了 AMQP 的 消息队列 服务,是当前主流的消息中间件之⼀. AMQP:即Advanced MessageQueuingProtocol(高级…...
使用spring boot vue 上传mp4转码为dash并播放
1.前端实现 <template><div class"video-upload"><el-uploadclass"upload-demo"action"/api/upload":before-upload"beforeUpload":on-success"handleSuccess":on-error"handleError":show-file-…...
C++智能指针概念理解的面试题
C智能指针概念理解的面试题 第一部分:基础概念 解释std::unique_ptr和std::shared_ptr在以下方面的区别: 所有权语义性能开销自定义删除器的存储方式是否支持数组类型 答案: 所有权语义: unique_ptr:独占所有权&#…...
52.[前端开发-JS实战框架应用]Day03-AJAX-插件开发-备课项目实战-Lodash
常用JavaScript库 1 认识前端工具库 前端工具类库 2 Lodash vs underscore underscore库 VS Lodash库 Lodash库 的安装 Lodash库字符串、数组 Lodash库对象、集合、函数 3 Day.js vs Mement Moment.js库 VS Day.js库 Day.js库安装 Day.js获取、设置、操作时间 Day.js解析、…...
【论文阅读】平滑量化:对大型语言模型进行准确高效的训练后量化
论文题目:SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models 论文地址:[2211.10438] SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models 代码地址:http…...
mysql游标分页详解:让分页又快又稳的终极方案
一、什么是游标分页? 游标分页是一种更高效的分页方式,它通过"记住当前位置"而不是"数页码"来实现分页。就像看书时夹书签一样,游标分页会记住你看到哪里了,下次直接从那里继续。 传统分页 vs 游标分页 传…...
图论---染色法(判断是否为二分图)
O(nm) 二分图:可以把所有的点划分到两边,使得边只在集合之间,集合内部没有边。 二分图当且仅当图中不含奇数环(边数为奇数条) #include <iostream> #include <vector> #include <cstring> using …...
算法 | 基于SSA-CNN-LSTM(麻雀算法优化卷积长短期记忆神经网络)的股票价格预测(附完整matlab代码,公式,原理,可用于毕业论文设计)
以下是一个基于SSA-CNN-LSTM(麻雀算法优化卷积长短期记忆神经网络)的股票价格预测MATLAB项目实例,包含完整代码和详细注释。代码分为数据预处理、模型构建、优化算法、训练预测四个部分。 🚜🚜🚜🚜🚜🚜🚜🚜🚜🚜🚜🚜🚜 1. 数据预处理 %% 数据加…...
在html中如何创建vue自定义组件(以自定义文件上传组件为例,vue2+elementUI)
1、先上代码:vueUpload.js var dom <div class"upload-file"><el-upload :action"uploadFileUrl" :before-upload"handleBeforeUpload" :file-list"fileList" :limit"limit":on-error"handleUpl…...
Asp.Net Core 基于(asp.net core 2.2) 创建asp .net core空项目
文章目录 ASP.NET Core 应用程序的标准入口点,用于配置和启动一个 Web 主机(WebHost)。`InProcess` 代码分析解决 HTTP Error 500.31 - Failed to load ASP.NET Core runtime 的完整方案**`launchSettings.json` 配置文件分析**ASP.NET Core 中的配置源详解ASP.NET Core 应用…...
AiFlutter 低代码平台介绍
产品概述 AiFlutter 低代码平台是一款基于拖拽组件和配置流程图的可视化开发工具,旨在简化移动应用开发过程。无需编写代码,用户即可通过拖拽组件快速搭建应用界面,并通过配置流程图设计页面逻辑。平台支持硬件通信功能,用户可直…...
Flutter Dart 集合类型List Set Map详解军 以及循环语句 forEaclh map where any every
List基础用法 var list1 ["西瓜", "苹果", "香蕉", true, 0];var list2 <String>["西瓜", "苹果", "香蕉"];List list3 ["西瓜", "苹果", "香蕉"];list3.add("草莓&…...
aws(学习笔记第三十九课) iot-msk-pipeline
文章目录 aws(学习笔记第三十九课) iot-msk-pipeline学习内容:1. 整体架构1.1 代码链接1.2 代码调整1.2 整体架构(概要)1.3 整体架构(详细) 2. 代码解析2.1 创建IotProducerDestination2.2 创建IotProducer2.3 创建MSK client的EC22.4 创建MSK cluster2.5 创建Main …...
2025上海车展:赛轮思AI携手行业领军企业展示xUI——混合式、智能体化的AI助理平台
用户将可首次全面体验集成多模态SLM (端侧大语言模型)的Cerence xUl,此次演示由长城汽车和TCL合作呈现 马萨诸塞州伯灵顿,2025年4月22日——Cerence Inc.(NASDAQ: CRNC)(“赛轮思AI”),全球对话…...
聚合分销小程序系统开发方案:整合AI对话、网盘、淘客CPS/CPA、电影票团购与会员卡业务
一、系统架构设计 技术架构 分层设计:采用微服务架构,分为平台层(分销管理、数据库、交易系统)、管理体系层(数据管理、权限控制)和功能层(AI对话、网盘、CPS/CPA拉新、电影票团购、会员卡&…...
设计模式-- 原型模式详解
原型模式(prototype) 原型模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象,原型模式属于创造性模式,它同样提供了创建对象的最佳方式之一。(效率很高…...
ARM服务器与X86服务器核心区别分析
ARM服务器与X86服务器核心区别分析 一、架构设计与指令集差异 指令集本质 ARM:基于RISC(精简指令集),指令定长且简单,单周期执行效率高,硬件设计复杂度低,适合低功耗场景。 X86…...
嵌入式:ARM系列分类及主要应用场景
在嵌入式系统和移动计算领域,Arm Cortex 系列处理器凭借其多样化的架构和卓越的性能,成为了众多设备的核心 “大脑”。从高端智能手机到工业控制设备,从物联网终端到安全芯片,Cortex 系列处理器以不同的型号和特性,满足…...
Axure PR 9 中继器 标签
大家好,我是大明同学。 这期内容,我们来了解一下Axure中继器数据表标签交互设计。 预览地址:https://n05kfs.axshare.com 好的,这里就结束了。 我是大明同学。 下期见。...
Django【应用 01】django-plotly-dash安装及使用
django-plotly-dash 的使用文档:https://django-plotly-dash.readthedocs.io/en/stable/introduction.html 以下内容大部分保留原文档的内容,添加实际的步骤和必要的说明。 django-plotly-dash安装及使用 1.安装配置1.1 安装1.2 注册组件1.3 配置框架1.…...
【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
打开以前的MFC示例报错,打开VS2019的实例以及更早VS版本的实例都一样,打不开,还报错; 错误 MSB8041 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 GxCameraEvents_VS2015 C:\P…...
ClickHouse 中`MergeTree` 和 `ReplicatedMergeTree`表引擎区别
在 ClickHouse 中,MergeTree 和 ReplicatedMergeTree 都是用于存储和管理数据的表引擎,但它们的主要区别在于是否支持数据复制。下面详细解释两者的不同点及其适用场景。 MergeTree 定义: MergeTree 是 ClickHouse 中最基本的表引擎之一&a…...
PubMed PDF下载 cloudpmc-viewer-pow逆向
目标:https://pmc.ncbi.nlm.nih.gov/articles/ pdf的下载链接是直接存在的 但是第一次单击下载不会触发PDF下载,而是跳转到验证页面然后又跳回概览页面 再次点击下载按钮,PDF就能正常下载了。现在要分析下载PDF要验证什么,如cooki…...
C语言面试高频题——strcat、strncat、strcmp、strcpy 哪些函数会导致内存溢出?
1. 函数功能与内存溢出风险 (1) strcat 功能:将源字符串追加到目标字符串的末尾。 原型: char *strcat(char *dest, const char *src);内存溢出风险: strcat 不会检查目标缓冲区的大小,直接将源字符串追加到目标字符串后。如果目…...
Linux套接字+Sqlite实例:客户端-服务器应用程序教程
本文将详细介绍如何创建一个基于客户端-服务器架构的应用程序,实现用户注册、登录、单词查询以及历史记录查询。该应用通过TCP套接字进行客户端和服务器之间的通信,并通过SQLite数据库进行用户和查询记录的管理。教程会逐步解析客户端和服务器端的实现&a…...