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

Flink优化----FlinkSQL 调优

目录

FlinkSQL 调优

1 设置空闲状态保留时间

2 开启 MiniBatch

3 开启 LocalGlobal

3.1 原理概述

3.2 提交案例:统计每天每个 mid 出现次数

3.3 提交案例:开启 miniBatch 和 LocalGlobal

4 开启 Split Distinct

4.1 原理概述

4.2 提交案例:count (distinct) 存在热点问题

4.3 提交案例:开启 split distinct

5 多维 DISTINCT 使用 Filter

5.1 原理概述

5.2 提交案例:多维 Distinct

5.3 提交案例:使用 Filter

6 设置参数总结

总结


        在 Flink SQL 的应用场景中,优化工作至关重要,它直接关乎作业的性能、资源利用以及数据处理的准确性与高效性。随着数据量的不断增长和业务需求的日益复杂,若不对 Flink SQL 进行调优,可能会面临诸如状态失控、处理延迟过高、资源瓶颈等诸多问题。例如,新手容易忽视的空闲状态保留时间设置不当,可能导致状态爆炸;而在聚合操作中,数据倾斜也会严重影响性能。深入了解并掌握 Flink SQL 的调优技巧,能够让我们在大数据处理的浪潮中更好地驾驭 Flink SQL,确保数据处理任务平稳、高效地运行。

FlinkSQL 调优

FlinkSQL 官网配置参数:
//nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/table/config/

1 设置空闲状态保留时间

Flink SQL 新手有可能犯的错误,其中之一就是忘记设置空闲状态保留时间导致状态爆炸。列举两个场景:

  • FlinkSQL 的 regular join(inner、left、right),左右表的数据都会一直保存在状态里,不会清理!要么设置 TTL,要么使用 FlinkSQL 的 interval join。
  • 使用 Top-N 语法进行去重,重复数据的出现一般都位于特定区间内(例如一小时或一天内),过了这段时间之后,对应的状态就不再需要了。

Flink SQL 可以指定空闲状态 (即未更新的状态) 被保留的最小时间,当状态中某个 key 对应的状态未更新的时间达到阈值时,该条状态被自动清理:

收起

java

// API 指定
tableEnv.getConfig().setIdleStateRetention(Duration.ofHours(1));
// 参数指定
Configuration configuration = tableEnv.getConfig().getConfiguration();
configuration.setString("table.exec.state.ttl", "1 h");

2 开启 MiniBatch

MiniBatch 是微批处理,原理是缓存一定的数据后再触发处理,以减少对 State 的访问,从而提升吞吐并减少数据的输出量。MiniBatch 主要依靠在每个 Task 上注册的 Timer 线程来触发微批,需要消耗一定的线程调度性能。

  • MiniBatch 默认关闭,开启方式如下:

收起

java

// 初始化 table environment
TableEnvironment tEnv =...// 获取 tableEnv 的配置对象
Configuration configuration = tEnv.getConfig().getConfiguration();// 设置参数:
// 开启 miniBatch
configuration.setString("table.exec.mini-batch.enabled", "true");
// 批量输出的间隔时间
configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
// 防止 OOM 设置每个批次最多缓存数据的条数,可以设为 2 万条
configuration.setString("table.exec.mini-batch.size", "20000");

  • 适用场景:
    微批处理通过增加延迟换取高吞吐,如果有超低延迟的要求,不建议开启微批处理。通常对于聚合的场景,微批处理可以显著的提升系统性能,建议开启。

  • 注意事项:

    1. 目前,key-value 配置项仅被 Blink planner 支持。
    2. 1.12 之前的版本有 bug,开启 miniBatch,不会清理过期状态,也就是说如果设置状态的 TTL,无法清理过期状态。1.12 版本才修复这个问题。
      参考 ISSUE:[FLINK-17096] Mini-batch group aggregation doesn't expire state even if state ttl is enabled - ASF JIRA

3 开启 LocalGlobal

3.1 原理概述

LocalGlobal 优化将原先的 Aggregate 分成 Local + Global 两阶段聚合,即 MapReduce 模型中的 Combine + Reduce 处理模式。第一阶段在上游节点本地攒一批数据进行聚合(localAgg),并输出这次微批的增量值(Accumulator)。第二阶段再将收到的 Accumulator 合并(Merge),得到最终的结果(GlobalAgg)。

LocalGlobal 本质上能够靠 LocalAgg 的聚合筛除部分倾斜数据,从而降低 GlobalAgg 的热点,提升性能。结合下图理解 LocalGlobal 如何解决数据倾斜的问题。

由上图可知:

  • 未开启 LocalGlobal 优化,由于流中的数据倾斜,Key 为红色的聚合算子实例需要处理更多的记录,这就导致了热点问题。

  • 开启 LocalGlobal 优化后,先进行本地聚合,再进行全局聚合。可大大减少 GlobalAgg 的热点,提高性能。

  • LocalGlobal 开启方式:

    1. LocalGlobal 优化需要先开启 MiniBatch,依赖于 MiniBatch 的参数。
    2. table.optimizer.agg-phase-strategy: 聚合策略。默认 AUTO,支持参数 AUTO、TWO_PHASE (使用 LocalGlobal 两阶段聚合)、ONE_PHASE (仅使用 Global 一阶段聚合)。

收起

java

// 初始化 table environment
TableEnvironment tEnv =...// 获取 tableEnv 的配置对象
Configuration configuration = tEnv.getConfig().getConfiguration();// 设置参数:
// 开启 miniBatch
configuration.setString("table.exec.mini-batch.enabled", "true");
// 批量输出的间隔时间
configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
// 防止 OOM 设置每个批次最多缓存数据的条数,可以设为 2 万条
configuration.setString("table.exec.mini-batch.size", "20000");
// 开启 LocalGlobal
configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE");

  • 注意事项:
    1. 需要先开启 MiniBatch
    2. 开启 LocalGlobal 需要 UDAF 实现 Merge 方法。

3.2 提交案例:统计每天每个 mid 出现次数

收起

plaintext

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.SqlDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar \
--demo count

可以看到存在数据倾斜。

3.3 提交案例:开启 miniBatch 和 LocalGlobal

收起

plaintext

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.SqlDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar \
--demo count \
--minibatch true \
--local-global true

从 WebUI 可以看到分组聚合变成了 Local 和 Global 两部分,数据相对均匀,且没有数据倾斜。

4 开启 Split Distinct

LocalGlobal 优化针对普通聚合(例如 SUM、COUNT、MAX、MIN 和 AVG)有较好的效果,对于 DISTINCT 的聚合(如 COUNT DISTINCT)收效不明显,因为 COUNT DISTINCT 在 Local 聚合时,对于 DISTINCT KEY 的去重率不高,导致在 Global 节点仍然存在热点。

4.1 原理概述

之前,为了解决 COUNT DISTINCT 的热点问题,通常需要手动改写为两层聚合(增加按 Distinct Key 取模的打散层)。

从 Flink1.9.0 版本开始,提供了 COUNT DISTINCT 自动打散功能,通过 HASH_CODE (distinct_key) % BUCKET_NUM 打散,不需要手动重写。Split Distinct 和 LocalGlobal 的原理对比参见下图。

Distinct 举例:

收起

sql

SELECT a, COUNT(DISTINCT b)
FROM T
GROUP BY a

手动打散举例:

收起

sql

SELECT a, SUM(cnt)
FROM (SELECT a, COUNT(DISTINCT b) as cntFROM TGROUP BY a, MOD(HASH_CODE(b), 1024)
)
GROUP BY a

  • Split Distinct 开启方式:
    默认不开启,使用参数显式开启:

收起

java

table.optimizer.distinct-agg.split.enabled: true,默认 false。
table.optimizer.distinct-agg.split.bucket-num: Split Distinct 优化在第一层聚合中,被打散的 bucket 数目。默认 1024。

java

// 初始化 table environment
TableEnvironment tEnv =...// 获取 tableEnv 的配置对象
Configuration configuration = tEnv.getConfig().getConfiguration();// 设置参数:(要结合 minibatch 一起使用)
// 开启 Split Distinct
configuration.setString("table.optimizer.distinct-agg.split.enabled", "true");
// 第一层打散的 bucket 数目
configuration.setString("table.optimizer.distinct-agg.split.bucket-num", "1024");

  • 注意事项:
    1. 目前不能在包含 UDAF 的 Flink SQL 中使用 Split Distinct 优化方法。
    2. 拆分出来的两个 GROUP 聚合还可参与 LocalGlobal 优化。
    3. 该功能在 Flink1.9.0 版本及以上版本才支持。

4.2 提交案例:count (distinct) 存在热点问题

收起

plaintext

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.SqlDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar \
--demo distinct

可以看到存在热点问题。

4.3 提交案例:开启 split distinct

收起

plaintext

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.SqlDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar \
--demo distinct \
--minibatch true \
--split-distinct true 

从 WebUI 可以看到有两次聚合,而且有 partialFinal 字样,第二次聚合时已经均匀。

5 多维 DISTINCT 使用 Filter

5.1 原理概述

在某些场景下,可能需要从不同维度来统计 count(distinct)的结果(比如统计 uv、app 端的 uv、web 端的 uv),可能会使用如下 CASE WHEN 语法。

收起

sql

SELECTa,COUNT(DISTINCT b) AS total_b,COUNT(DISTINCT CASE WHEN c IN ('A', 'B') THEN b ELSE NULL END) AS AB_b,COUNT(DISTINCT CASE WHEN c IN ('C', 'D') THEN b ELSE NULL END) AS CD_b
FROM T
GROUP BY a

在这种情况下,建议使用 FILTER 语法,目前的 Flink SQL 优化器可以识别同一唯一键上的不同 FILTER 参数。如,在上面的示例中,三个 COUNT DISTINCT 都作用在 b 列上。此时,经过优化器识别后,Flink 可以只使用一个共享状态实例,而不是三个状态实例,可减少状态的大小和对状态的访问。

将上边的 CASE WHEN 替换成 FILTER 后,如下所示:

收起

sql

SELECTa,COUNT(DISTINCT b) AS total_b,COUNT(DISTINCT b) FILTER (WHERE c IN ('A', 'B')) AS AB_b,COUNT(DISTINNT b) FILTER (WHERE c IN ('C', 'D')) AS CD_b
FROM T
GROUP BY a

5.2 提交案例:多维 Distinct

收起

plaintext

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.SqlDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar \
--demo dim-difcount

5.3 提交案例:使用 Filter

收起

plaintext

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=2048mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.SqlDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar \
--demo dim-difcount-filter

通过 WebUI 对比前 10 次 Checkpoint 的大小,可以看到状态有所减小。

6 设置参数总结

总结以上的调优参数,代码如下:

收起

java

// 初始化 table environment
TableEnvironment tEnv =...// 获取 tableEnv 的配置对象
Configuration configuration = tEnv.getConfig().getConfiguration();// 设置参数:
// 开启 miniBatch
configuration.setString("table.exec.mini-batch.enabled", "true");
// 批量输出的间隔时间
configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
// 防止 OOM 设置每个批次最多缓存数据的条数,可以设为 2 万条
configuration.setString("table.exec.mini-batch.size", "20000");
// 开启 LocalGlobal
configuration.setString("table.optimizer.agg-phase-strategy", "TWO_PHASE");
// 开启 Split Distinct
configuration.setString("table.optimizer.distinct-agg.split.enabled", "true");
// 第一层打散的 bucket 数目
configuration.setString("table.optimizer.distinct-agg.split.bucket-num", "1024");
// 指定时区
configuration.setString("table.local-time-zone", "Asia/Shanghai");

总结

        本文全面深入地讲解了 Flink SQL 调优的关键要点。

        在设置空闲状态保留时间方面,明确了其对于防止因遗忘而导致状态爆炸的关键作用,尤其是在 regular join 和 Top-N 去重场景中,并给出了 API 和参数两种指定方式。MiniBatch 微批处理通过缓存数据触发处理来提升性能,但有适用场景限制且在不同 Flink 版本存在差异。LocalGlobal 优化通过独特的两阶段聚合模式有效解决数据倾斜问题,不过要依赖 MiniBatch 且对 UDAF 有要求,通过案例展示了其优化效果。Split Distinct 为 COUNT DISTINCT 聚合提供了新的优化思路,虽有功能限制但在特定场景下能发挥作用,案例也呈现了开启前后的变化。多维 DISTINCT 使用 Filter 借助优化器识别减少了状态实例,WebUI 中 Checkpoint 大小的对比直观体现了其优势。

        总之,掌握这些 Flink SQL 调优知识,能帮助使用者在实际应用中根据具体业务需求灵活运用调优策略,提升 Flink SQL 作业的整体质量和性能,有效应对各种复杂的数据处理挑战,保障数据处理流程的高效与稳定。

相关文章:

Flink优化----FlinkSQL 调优

目录 FlinkSQL 调优 1 设置空闲状态保留时间 2 开启 MiniBatch 3 开启 LocalGlobal 3.1 原理概述 3.2 提交案例:统计每天每个 mid 出现次数 3.3 提交案例:开启 miniBatch 和 LocalGlobal 4 开启 Split Distinct 4.1 原理概述 4.2 提交案例&…...

机器学习(二)-简单线性回归

文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …...

01.01、判定字符是否唯一

01.01、[简单] 判定字符是否唯一 1、题目描述 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 在这一题中,我们的任务是判断一个字符串 s 中的所有字符是否全都不同。我们将讨论两种不同的方法来解决这个问题,并详细解释每种方法…...

第五届“传智杯”全国大学生计算机大赛(练习赛)水题题解

目录 复读 题目描述 输入格式 输出格式 输入输出 说明/提示 源代码 时钟 题目描述 输入格式 输出格式 输入输出 说明/提示 源代码 平等的交易 题目描述 输入格式 输出格式 输入输出 说明/提示 源代码 清洁工 题目描述 输入格式 输出格式 输入输出…...

iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量

参考链接:苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里: 1.登录开发者中心 Sign In - Apple 2.找到证书设置: Certificate,Identifiers&Profiles > Profiles > 选择对应证书 edit &g…...

推进数字园区建设-成都国际数字影像产业园

在当今数字化浪潮的席卷下,数字园区建设已成为推动区域经济发展、提升产业竞争力的关键举措。成都国际数字影像产业园作为数字产业领域的重要项目,以其独特的发展模式和创新实践,在推进数字园区建设方面取得了显著成效,为数字产业…...

oracle linux8.10+ oracle 23ai安装

介质准备: 数据库23ai https://edelivery.oracle.com 上述网站下载基础版本,本次未使用。 本次是安装了带补丁的版本: Database Release Update 23.6.0.24.10 GoldImage表示带补丁用于直接安装的软件包 查找888.1对应Primary Note for …...

PH热榜 | 2024-12-25

1. Assistive24 标语:为残障人士提供的免费辅助技术 介绍:Assistive24 是一款免费的 Chrome 浏览器扩展程序,可以帮助患有注意力缺陷多动障碍 (ADHD)、阅读障碍 (dyslexia) 和低视力等障碍的用户更方便地浏览网页。它提供语音导航、自定义…...

OpenCV相机标定与3D重建(36)计算两幅图像之间基本矩阵(Fundamental Matrix)的函数findFundamentalMat()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从两幅图像中的对应点计算基本矩阵。 cv::findFundamentalMat 是 OpenCV 中用于计算两幅图像之间基本矩阵(Fundamental Matrix&#…...

ZLG嵌入式笔记 | 电源设计避坑(上)

产品上量后,通常都会有降成需求。多年来,接触过不少产品降成案例,在电源上下刀过猛,引发了产品偶发性问题,带来了很不好的负面影响。本文将对这些案例进行总结,提供电源设计参考,确保产品降成不…...

.NET能做什么?全面解析.NET的应用领域

.NET 是由微软开发的一个开源、跨平台的开发框架。它不仅支持构建各种应用程序,还能运行在不同的操作系统上,包括 Windows、Linux 和 macOS。自从 .NET Core 的推出,.NET 成为了一个现代化的开发平台,能够满足企业和开发者日益多样…...

初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 UDP协议 参数解析: 校验和的计算 TCP协议 参数解析: 确认应答机制 超时重传 连接管理 三次握…...

企业如何搭建安全的跨网文件安全交换管理系统

在数字化转型的浪潮中,企业对数据的安全性和流动性提出了前所未有的高要求。特别是在网络隔离的情况下,如何实现跨网的安全、高效的文件交换成为了众多企业迫切需要解决的问题。 这不仅是技术上的挑战,还涉及到企业内部管理流程的优化和安全策…...

2023 年 12 月青少年软编等考 C 语言四级真题解析

目录 T1. 移动路线T2. 公共子序列T3. 田忌赛马T4. 宠物小精灵之收服 T1. 移动路线 此题为 2021 年 12 月四级第一题原题,见 2021 年 12 月青少年软编等考 C 语言四级真题解析中的 T1。 T2. 公共子序列 此题为 2022 年 3 月四级第四题原题,见 2022 年 …...

GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)

记住,年底陪你跨年的不会仅是方便面跟你的闺蜜,还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是()。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根实例对象的元素是(&…...

老旧小区用电安全保护装置#限流式防火保护器参数介绍#

摘要 随着居民住宅区用电负荷的增加,用电安全问题日益突出,火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备,能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…...

7.C语言 宏(Macro) 宏定义,宏函数

目录 宏定义 宏函数 1.注释事项 2.注意事项 宏(Macro)用法 常量定义 简单函数实现 类型检查 条件编译 宏函数计算参数个数 宏定义进行类型转换 宏定义进行位操作 宏定义进行断言 总结 宏定义 #include "stdio.h" #include "string.h" #incl…...

4.系统学习-集成学习

集成学习 前言Bias and Variance过拟合(overfitting)与欠拟合(underfitting)集成学习为什么有效?Blending 模型集成Stakcing 模型集成Bagging模型集成Bagging 模型集成算法流程:Boosting模型集成作业 前言 …...

Max AI prompt2:

1,prompt1——总体概览 “请根据以下指导原则撰写文献解读,特别关注作者的研究思路和方法论: 1. 研究背景与目的: 概述文章研究的背景,明确研究的主要目的和研究问题。 2. 研究思路: 详细描述作者如何构建…...

[Unity Shader][图形渲染]【游戏开发】 Shader数学基础8 - 齐次坐标

在计算机图形学中,齐次坐标是一种方便计算和表示几何变换的方式。通过将三维空间中的 33矩阵扩展为 44的形式,可以统一表示平移、旋转、缩放等几何变换操作。在本篇文章中,我们将详细解析齐次坐标的定义及其在图形变换中的应用。 什么是齐次坐标? 齐次坐标的核心思想是通过…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

go 里面的指针

指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...